Commit 9d49f86d authored by Sebastian Ott's avatar Sebastian Ott Committed by Martin Schwidefsky

s390/cio: introduce pathmask_to_pos

We often need to correlate an 8 bit path mask with the position
in a channel path array. Introduce and use pathmask_to_pos for
that task.
Reviewed-by: default avatarPeter Oberparleiter <oberpar@linux.vnet.ibm.com>
Signed-off-by: default avatarSebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent ab97d211
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#define _ASM_S390_CIO_H_ #define _ASM_S390_CIO_H_
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/bitops.h>
#include <asm/types.h> #include <asm/types.h>
#define LPM_ANYPATH 0xff #define LPM_ANYPATH 0xff
...@@ -296,6 +297,15 @@ static inline int ccw_dev_id_is_equal(struct ccw_dev_id *dev_id1, ...@@ -296,6 +297,15 @@ static inline int ccw_dev_id_is_equal(struct ccw_dev_id *dev_id1,
return 0; return 0;
} }
/**
* pathmask_to_pos() - find the position of the left-most bit in a pathmask
* @mask: pathmask with at least one bit set
*/
static inline u8 pathmask_to_pos(u8 mask)
{
return 8 - ffs(mask);
}
void channel_subsystem_reinit(void); void channel_subsystem_reinit(void);
extern void css_schedule_reprobe(void); extern void css_schedule_reprobe(void);
......
...@@ -1068,8 +1068,7 @@ static int dasd_eckd_read_conf(struct dasd_device *device) ...@@ -1068,8 +1068,7 @@ static int dasd_eckd_read_conf(struct dasd_device *device)
path_data->opm |= lpm; path_data->opm |= lpm;
continue; /* no error */ continue; /* no error */
} }
/* translate path mask to position in mask */ pos = pathmask_to_pos(lpm);
pos = 8 - ffs(lpm);
kfree(private->path_conf_data[pos]); kfree(private->path_conf_data[pos]);
if ((__u8 *)private->path_conf_data[pos] == if ((__u8 *)private->path_conf_data[pos] ==
private->conf_data) { private->conf_data) {
...@@ -4671,7 +4670,7 @@ static struct dasd_conf_data *dasd_eckd_get_ref_conf(struct dasd_device *device, ...@@ -4671,7 +4670,7 @@ static struct dasd_conf_data *dasd_eckd_get_ref_conf(struct dasd_device *device,
return conf_data; return conf_data;
} }
out: out:
return private->path_conf_data[8 - ffs(lpum)]; return private->path_conf_data[pathmask_to_pos(lpum)];
} }
/* /*
...@@ -4716,7 +4715,7 @@ static int dasd_eckd_cuir_scope(struct dasd_device *device, __u8 lpum, ...@@ -4716,7 +4715,7 @@ static int dasd_eckd_cuir_scope(struct dasd_device *device, __u8 lpum,
for (path = 0x80; path; path >>= 1) { for (path = 0x80; path; path >>= 1) {
/* initialise data per path */ /* initialise data per path */
bitmask = mask; bitmask = mask;
pos = 8 - ffs(path); pos = pathmask_to_pos(path);
conf_data = private->path_conf_data[pos]; conf_data = private->path_conf_data[pos];
pos = 8 - ffs(cuir->ned_map); pos = 8 - ffs(cuir->ned_map);
ned = (char *) &conf_data->neds[pos]; ned = (char *) &conf_data->neds[pos];
...@@ -4937,9 +4936,7 @@ static void dasd_eckd_handle_cuir(struct dasd_device *device, void *messages, ...@@ -4937,9 +4936,7 @@ static void dasd_eckd_handle_cuir(struct dasd_device *device, void *messages,
((u64 *)cuir)[0], ((u64 *)cuir)[1], ((u64 *)cuir)[2], ((u64 *)cuir)[0], ((u64 *)cuir)[1], ((u64 *)cuir)[2],
((u32 *)cuir)[3]); ((u32 *)cuir)[3]);
ccw_device_get_schid(device->cdev, &sch_id); ccw_device_get_schid(device->cdev, &sch_id);
/* get position of path in mask */ pos = pathmask_to_pos(lpum);
pos = 8 - ffs(lpum);
/* get channel path descriptor from this position */
desc = ccw_device_get_chp_desc(device->cdev, pos); desc = ccw_device_get_chp_desc(device->cdev, pos);
if (cuir->code == CUIR_QUIESCE) { if (cuir->code == CUIR_QUIESCE) {
......
...@@ -133,7 +133,7 @@ static void spid_build_cp(struct ccw_device *cdev, u8 fn) ...@@ -133,7 +133,7 @@ static void spid_build_cp(struct ccw_device *cdev, u8 fn)
{ {
struct ccw_request *req = &cdev->private->req; struct ccw_request *req = &cdev->private->req;
struct ccw1 *cp = cdev->private->iccws; struct ccw1 *cp = cdev->private->iccws;
int i = 8 - ffs(req->lpm); int i = pathmask_to_pos(req->lpm);
struct pgid *pgid = &cdev->private->pgid[i]; struct pgid *pgid = &cdev->private->pgid[i];
pgid->inf.fc = fn; pgid->inf.fc = fn;
...@@ -434,7 +434,7 @@ static void snid_build_cp(struct ccw_device *cdev) ...@@ -434,7 +434,7 @@ static void snid_build_cp(struct ccw_device *cdev)
{ {
struct ccw_request *req = &cdev->private->req; struct ccw_request *req = &cdev->private->req;
struct ccw1 *cp = cdev->private->iccws; struct ccw1 *cp = cdev->private->iccws;
int i = 8 - ffs(req->lpm); int i = pathmask_to_pos(req->lpm);
/* Channel program setup. */ /* Channel program setup. */
cp->cmd_code = CCW_CMD_SENSE_PGID; cp->cmd_code = CCW_CMD_SENSE_PGID;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment