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: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
ab97d211ef
commit
9d49f86dab
@ -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,
|
|||||||
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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
((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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
{
|
{
|
||||||
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user