*
*/
+#include <linux/config.h>
#include <linux/ctype.h>
#include <linux/init.h>
-#include <linux/module.h>
#include <asm/debug.h>
#include <asm/uaccess.h>
#include "dasd_int.h"
kmem_cache_t *dasd_page_cache;
-EXPORT_SYMBOL_GPL(dasd_page_cache);
+EXPORT_SYMBOL(dasd_page_cache);
/*
* dasd_devmap_t is used to store the features and the relation
unsigned int devindex;
unsigned short features;
struct dasd_device *device;
- struct dasd_uid uid;
};
-/*
- * dasd_server_ssid_map contains a globally unique storage server subsystem ID.
- * dasd_server_ssid_list contains the list of all subsystem IDs accessed by
- * the DASD device driver.
- */
-struct dasd_server_ssid_map {
- struct list_head list;
- struct system_id {
- char vendor[4];
- char serial[15];
- __u16 ssid;
- } sid;
-};
-
-static struct list_head dasd_server_ssid_list;
-
/*
* Parameter parsing functions for dasd= parameter. The syntax is:
* <devno> : (0x)?[0-9a-fA-F]+
int dasd_probeonly = 0; /* is true, when probeonly mode is active */
int dasd_autodetect = 0; /* is true, when autodetection is active */
-int dasd_nopav = 0; /* is true, when PAV is disabled */
-EXPORT_SYMBOL_GPL(dasd_nopav);
/*
* char *dasd[] is intended to hold the ranges supplied by the dasd= statement
* strings when running as a module.
*/
static char *dasd[256];
-module_param_array(dasd, charp, NULL, 0);
-
/*
- * Single spinlock to protect devmap and servermap structures and lists.
+ * Single spinlock to protect devmap structures and lists.
*/
static DEFINE_SPINLOCK(dasd_devmap_lock);
dasd_busid(char **str, int *id0, int *id1, int *devno)
{
int val, old_style;
-
+
/* check for leading '0x' */
old_style = 0;
if ((*str)[0] == '0' && (*str)[1] == 'x') {
features = 0;
while (1) {
- for (len = 0;
+ for (len = 0;
str[len] && str[len] != ':' && str[len] != ')'; len++);
if (len == 2 && !strncmp(str, "ro", 2))
features |= DASD_FEATURE_READONLY;
length = strlen(parsestring);
residual_str = parsestring + length;
}
- if (strncmp("autodetect", parsestring, length) == 0) {
+ if (strncmp ("autodetect", parsestring, length) == 0) {
dasd_autodetect = 1;
MESSAGE (KERN_INFO, "%s",
"turning to autodetection mode");
return residual_str;
}
- if (strncmp("probeonly", parsestring, length) == 0) {
+ if (strncmp ("probeonly", parsestring, length) == 0) {
dasd_probeonly = 1;
MESSAGE(KERN_INFO, "%s",
"turning to probeonly mode");
return residual_str;
}
- if (strncmp("nopav", parsestring, length) == 0) {
- dasd_nopav = 1;
- MESSAGE(KERN_INFO, "%s", "disable PAV mode");
- return residual_str;
- }
- if (strncmp("fixedbuffers", parsestring, length) == 0) {
+ if (strncmp ("fixedbuffers", parsestring, length) == 0) {
if (dasd_page_cache)
return residual_str;
dasd_page_cache =
- kmem_cache_create("dasd_page_cache", PAGE_SIZE,
- PAGE_SIZE, SLAB_CACHE_DMA,
- NULL, NULL );
+ kmem_cache_create("dasd_page_cache", PAGE_SIZE, 0,
+ SLAB_CACHE_DMA, NULL, NULL );
if (!dasd_page_cache)
MESSAGE(KERN_WARNING, "%s", "Failed to create slab, "
"fixed buffer mode disabled.");
features = dasd_feature_list(str, &str);
if (features < 0)
return ERR_PTR(-EINVAL);
- /* each device in dasd= parameter should be set initially online */
- features |= DASD_FEATURE_INITIAL_ONLINE;
while (from <= to) {
sprintf(bus_id, "%01x.%01x.%04x",
from_id0, from_id1, from++);
* Add a devmap for the device specified by busid. It is possible that
* the devmap already exists (dasd= parameter). The order of the devices
* added through this function will define the kdevs for the individual
- * devices.
+ * devices.
*/
static struct dasd_devmap *
dasd_add_busid(char *bus_id, int features)
int hash;
new = (struct dasd_devmap *)
- kzalloc(sizeof(struct dasd_devmap), GFP_KERNEL);
+ kmalloc(sizeof(struct dasd_devmap), GFP_KERNEL);
if (!new)
return ERR_PTR(-ENOMEM);
spin_lock(&dasd_devmap_lock);
- devmap = NULL;
+ devmap = 0;
hash = dasd_hash_busid(bus_id);
list_for_each_entry(tmp, &dasd_hashlists[hash], list)
if (strncmp(tmp->bus_id, bus_id, BUS_ID_SIZE) == 0) {
new->devindex = dasd_max_devindex++;
strncpy(new->bus_id, bus_id, BUS_ID_SIZE);
new->features = features;
- new->device = NULL;
+ new->device = 0;
list_add(&new->list, &dasd_hashlists[hash]);
devmap = new;
- new = NULL;
+ new = 0;
}
spin_unlock(&dasd_devmap_lock);
kfree(new);
spin_lock(&dasd_devmap_lock);
for (i = 0; i < 256; i++) {
list_for_each_entry_safe(devmap, n, &dasd_hashlists[i], list) {
- BUG_ON(devmap->device != NULL);
+ if (devmap->device != NULL)
+ BUG();
list_del(&devmap->list);
kfree(devmap);
}
int i;
spin_lock(&dasd_devmap_lock);
- devmap = NULL;
+ devmap = 0;
for (i = 0; (i < 256) && !devmap; i++)
list_for_each_entry(tmp, &dasd_hashlists[i], list)
if (tmp->devindex == devindex) {
/* First remove device pointer from devmap. */
devmap = dasd_find_busid(device->cdev->dev.bus_id);
- BUG_ON(IS_ERR(devmap));
+ if (IS_ERR(devmap))
+ BUG();
spin_lock(&dasd_devmap_lock);
if (devmap->device != device) {
spin_unlock(&dasd_devmap_lock);
}
static ssize_t
-dasd_ro_store(struct device *dev, struct device_attribute *attr,
- const char *buf, size_t count)
+dasd_ro_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
struct dasd_devmap *devmap;
int ro_flag;
* use_diag controls whether the driver should use diag rather than ssch
* to talk to the device
*/
-static ssize_t
+static ssize_t
dasd_use_diag_show(struct device *dev, struct device_attribute *attr, char *buf)
{
struct dasd_devmap *devmap;
}
static ssize_t
-dasd_use_diag_store(struct device *dev, struct device_attribute *attr,
- const char *buf, size_t count)
+dasd_use_diag_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
struct dasd_devmap *devmap;
ssize_t rc;
return rc;
}
-static DEVICE_ATTR(use_diag, 0644, dasd_use_diag_show, dasd_use_diag_store);
+static
+DEVICE_ATTR(use_diag, 0644, dasd_use_diag_show, dasd_use_diag_store);
static ssize_t
-dasd_discipline_show(struct device *dev, struct device_attribute *attr,
- char *buf)
+dasd_discipline_show(struct device *dev, struct device_attribute *attr, char *buf)
{
struct dasd_devmap *devmap;
char *dname;
static DEVICE_ATTR(discipline, 0444, dasd_discipline_show, NULL);
-static ssize_t
-dasd_alias_show(struct device *dev, struct device_attribute *attr, char *buf)
-{
- struct dasd_devmap *devmap;
- int alias;
-
- devmap = dasd_find_busid(dev->bus_id);
- spin_lock(&dasd_devmap_lock);
- if (!IS_ERR(devmap))
- alias = devmap->uid.alias;
- else
- alias = 0;
- spin_unlock(&dasd_devmap_lock);
-
- return sprintf(buf, alias ? "1\n" : "0\n");
-}
-
-static DEVICE_ATTR(alias, 0444, dasd_alias_show, NULL);
-
-static ssize_t
-dasd_vendor_show(struct device *dev, struct device_attribute *attr, char *buf)
-{
- struct dasd_devmap *devmap;
- char *vendor;
-
- devmap = dasd_find_busid(dev->bus_id);
- spin_lock(&dasd_devmap_lock);
- if (!IS_ERR(devmap) && strlen(devmap->uid.vendor) > 0)
- vendor = devmap->uid.vendor;
- else
- vendor = "";
- spin_unlock(&dasd_devmap_lock);
-
- return snprintf(buf, PAGE_SIZE, "%s\n", vendor);
-}
-
-static DEVICE_ATTR(vendor, 0444, dasd_vendor_show, NULL);
-
-#define UID_STRLEN ( /* vendor */ 3 + 1 + /* serial */ 14 + 1 +\
- /* SSID */ 4 + 1 + /* unit addr */ 2 + 1)
-
-static ssize_t
-dasd_uid_show(struct device *dev, struct device_attribute *attr, char *buf)
-{
- struct dasd_devmap *devmap;
- char uid[UID_STRLEN];
-
- devmap = dasd_find_busid(dev->bus_id);
- spin_lock(&dasd_devmap_lock);
- if (!IS_ERR(devmap) && strlen(devmap->uid.vendor) > 0)
- snprintf(uid, sizeof(uid), "%s.%s.%04x.%02x",
- devmap->uid.vendor, devmap->uid.serial,
- devmap->uid.ssid, devmap->uid.unit_addr);
- else
- uid[0] = 0;
- spin_unlock(&dasd_devmap_lock);
-
- return snprintf(buf, PAGE_SIZE, "%s\n", uid);
-}
-
-static DEVICE_ATTR(uid, 0444, dasd_uid_show, NULL);
-
-/*
- * extended error-reporting
- */
-static ssize_t
-dasd_eer_show(struct device *dev, struct device_attribute *attr, char *buf)
-{
- struct dasd_devmap *devmap;
- int eer_flag;
-
- devmap = dasd_find_busid(dev->bus_id);
- if (!IS_ERR(devmap) && devmap->device)
- eer_flag = dasd_eer_enabled(devmap->device);
- else
- eer_flag = 0;
- return snprintf(buf, PAGE_SIZE, eer_flag ? "1\n" : "0\n");
-}
-
-static ssize_t
-dasd_eer_store(struct device *dev, struct device_attribute *attr,
- const char *buf, size_t count)
-{
- struct dasd_devmap *devmap;
- int rc;
-
- devmap = dasd_devmap_from_cdev(to_ccwdev(dev));
- if (IS_ERR(devmap))
- return PTR_ERR(devmap);
- if (!devmap->device)
- return count;
- if (buf[0] == '1') {
- rc = dasd_eer_enable(devmap->device);
- if (rc)
- return rc;
- } else
- dasd_eer_disable(devmap->device);
- return count;
-}
-
-static DEVICE_ATTR(eer_enabled, 0644, dasd_eer_show, dasd_eer_store);
-
static struct attribute * dasd_attrs[] = {
&dev_attr_readonly.attr,
&dev_attr_discipline.attr,
- &dev_attr_alias.attr,
- &dev_attr_vendor.attr,
- &dev_attr_uid.attr,
&dev_attr_use_diag.attr,
- &dev_attr_eer_enabled.attr,
NULL,
};
.attrs = dasd_attrs,
};
-/*
- * Return copy of the device unique identifier.
- */
-int
-dasd_get_uid(struct ccw_device *cdev, struct dasd_uid *uid)
-{
- struct dasd_devmap *devmap;
-
- devmap = dasd_find_busid(cdev->dev.bus_id);
- if (IS_ERR(devmap))
- return PTR_ERR(devmap);
- spin_lock(&dasd_devmap_lock);
- *uid = devmap->uid;
- spin_unlock(&dasd_devmap_lock);
- return 0;
-}
-
-/*
- * Register the given device unique identifier into devmap struct.
- * In addition check if the related storage server subsystem ID is already
- * contained in the dasd_server_ssid_list. If subsystem ID is not contained,
- * create new entry.
- * Return 0 if server was already in serverlist,
- * 1 if the server was added successful
- * <0 in case of error.
- */
-int
-dasd_set_uid(struct ccw_device *cdev, struct dasd_uid *uid)
-{
- struct dasd_devmap *devmap;
- struct dasd_server_ssid_map *srv, *tmp;
-
- devmap = dasd_find_busid(cdev->dev.bus_id);
- if (IS_ERR(devmap))
- return PTR_ERR(devmap);
-
- /* generate entry for server_ssid_map */
- srv = (struct dasd_server_ssid_map *)
- kzalloc(sizeof(struct dasd_server_ssid_map), GFP_KERNEL);
- if (!srv)
- return -ENOMEM;
- strncpy(srv->sid.vendor, uid->vendor, sizeof(srv->sid.vendor) - 1);
- strncpy(srv->sid.serial, uid->serial, sizeof(srv->sid.serial) - 1);
- srv->sid.ssid = uid->ssid;
-
- /* server is already contained ? */
- spin_lock(&dasd_devmap_lock);
- devmap->uid = *uid;
- list_for_each_entry(tmp, &dasd_server_ssid_list, list) {
- if (!memcmp(&srv->sid, &tmp->sid,
- sizeof(struct system_id))) {
- kfree(srv);
- srv = NULL;
- break;
- }
- }
-
- /* add servermap to serverlist */
- if (srv)
- list_add(&srv->list, &dasd_server_ssid_list);
- spin_unlock(&dasd_devmap_lock);
-
- return (srv ? 1 : 0);
-}
-EXPORT_SYMBOL_GPL(dasd_set_uid);
-
/*
* Return value of the specified feature.
*/
devmap = dasd_find_busid(cdev->dev.bus_id);
if (IS_ERR(devmap))
- return PTR_ERR(devmap);
+ return (int) PTR_ERR(devmap);
return ((devmap->features & feature) != 0);
}
devmap = dasd_find_busid(cdev->dev.bus_id);
if (IS_ERR(devmap))
- return PTR_ERR(devmap);
+ return (int) PTR_ERR(devmap);
spin_lock(&dasd_devmap_lock);
if (flag)
dasd_max_devindex = 0;
for (i = 0; i < 256; i++)
INIT_LIST_HEAD(&dasd_hashlists[i]);
-
- /* Initialize servermap structure. */
- INIT_LIST_HEAD(&dasd_server_ssid_list);
return 0;
+
}
void