s390x/css: Add an algorithm to find a free chpid

This introduces a function named css_find_free_chpid() to find a
free channel path. Because virtio-ccw device used zero as its
channel path number, it would be sensible to skip the reserved one
and search upwards.

Signed-off-by: Jing Liu <liujbjl@linux.vnet.ibm.com>
Reviewed-by: QingFeng Hao <haoqf@linux.vnet.ibm.com>
Reviewed-by: Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
This commit is contained in:
Jing Liu 2016-09-19 09:10:43 +02:00 committed by Cornelia Huck
parent ae92cbd542
commit 6c15e9bfb6
2 changed files with 23 additions and 0 deletions

View File

@ -1302,6 +1302,27 @@ bool css_schid_final(int m, uint8_t cssid, uint8_t ssid, uint16_t schid)
(MAX_SCHID + 1) / sizeof(unsigned long)); (MAX_SCHID + 1) / sizeof(unsigned long));
} }
unsigned int css_find_free_chpid(uint8_t cssid)
{
CssImage *css = channel_subsys.css[cssid];
unsigned int chpid;
if (!css) {
return MAX_CHPID + 1;
}
for (chpid = 0; chpid <= MAX_CHPID; chpid++) {
/* skip reserved chpid */
if (chpid == VIRTIO_CCW_CHPID) {
continue;
}
if (!css->chpids[chpid].in_use) {
return chpid;
}
}
return MAX_CHPID + 1;
}
static int css_add_virtual_chpid(uint8_t cssid, uint8_t chpid, uint8_t type) static int css_add_virtual_chpid(uint8_t cssid, uint8_t chpid, uint8_t type)
{ {
CssImage *css; CssImage *css;

View File

@ -28,6 +28,7 @@
#define MAX_CIWS 62 #define MAX_CIWS 62
#define VIRTUAL_CSSID 0xfe #define VIRTUAL_CSSID 0xfe
#define VIRTIO_CCW_CHPID 0 /* used by convention */
typedef struct CIW { typedef struct CIW {
uint8_t type; uint8_t type;
@ -115,6 +116,7 @@ bool css_devno_used(uint8_t cssid, uint8_t ssid, uint16_t devno);
void css_subch_assign(uint8_t cssid, uint8_t ssid, uint16_t schid, void css_subch_assign(uint8_t cssid, uint8_t ssid, uint16_t schid,
uint16_t devno, SubchDev *sch); uint16_t devno, SubchDev *sch);
void css_sch_build_virtual_schib(SubchDev *sch, uint8_t chpid, uint8_t type); void css_sch_build_virtual_schib(SubchDev *sch, uint8_t chpid, uint8_t type);
unsigned int css_find_free_chpid(uint8_t cssid);
uint16_t css_build_subchannel_id(SubchDev *sch); uint16_t css_build_subchannel_id(SubchDev *sch);
void css_reset(void); void css_reset(void);
void css_reset_sch(SubchDev *sch); void css_reset_sch(SubchDev *sch);