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:
parent
ae92cbd542
commit
6c15e9bfb6
@ -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));
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
CssImage *css;
|
||||
|
@ -28,6 +28,7 @@
|
||||
#define MAX_CIWS 62
|
||||
|
||||
#define VIRTUAL_CSSID 0xfe
|
||||
#define VIRTIO_CCW_CHPID 0 /* used by convention */
|
||||
|
||||
typedef struct CIW {
|
||||
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,
|
||||
uint16_t devno, SubchDev *sch);
|
||||
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);
|
||||
void css_reset(void);
|
||||
void css_reset_sch(SubchDev *sch);
|
||||
|
Loading…
Reference in New Issue
Block a user