Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@
#define _ASM_S390_CIO_H_

#include <linux/spinlock.h>
#include <linux/bitops.h>
#include <asm/types.h>

#define LPM_ANYPATH 0xff
@@ -296,6 +297,15 @@ static inline int ccw_dev_id_is_equal(struct ccw_dev_id *dev_id1,
	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);
extern void css_schedule_reprobe(void);

+4 −7
Original line number Diff line number Diff line
@@ -1068,8 +1068,7 @@ static int dasd_eckd_read_conf(struct dasd_device *device)
			path_data->opm |= lpm;
			continue;	/* no error */
		}
		/* translate path mask to position in mask */
		pos = 8 - ffs(lpm);
		pos = pathmask_to_pos(lpm);
		kfree(private->path_conf_data[pos]);
		if ((__u8 *)private->path_conf_data[pos] ==
		    private->conf_data) {
@@ -4671,7 +4670,7 @@ static struct dasd_conf_data *dasd_eckd_get_ref_conf(struct dasd_device *device,
			return conf_data;
	}
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) {
		/* initialise data per path */
		bitmask = mask;
		pos = 8 - ffs(path);
		pos = pathmask_to_pos(path);
		conf_data = private->path_conf_data[pos];
		pos = 8 - ffs(cuir->ned_map);
		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],
		      ((u32 *)cuir)[3]);
	ccw_device_get_schid(device->cdev, &sch_id);
	/* get position of path in mask */
	pos = 8 - ffs(lpum);
	/* get channel path descriptor from this position */
	pos = pathmask_to_pos(lpum);
	desc = ccw_device_get_chp_desc(device->cdev, pos);

	if (cuir->code == CUIR_QUIESCE) {
+2 −2
Original line number Diff line number Diff line
@@ -133,7 +133,7 @@ static void spid_build_cp(struct ccw_device *cdev, u8 fn)
{
	struct ccw_request *req = &cdev->private->req;
	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];

	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 ccw1 *cp = cdev->private->iccws;
	int i = 8 - ffs(req->lpm);
	int i = pathmask_to_pos(req->lpm);

	/* Channel program setup. */
	cp->cmd_code	= CCW_CMD_SENSE_PGID;