I2O: SPARC fixes
PATCH 2/7 I2O: SPARC fixes
Changes:
--------
- Fixed lot of BE <-> LE bugs which prevent it from working on SPARC.
Signed-off-by Markus Lidel <[email protected]>
drivers/message/i2o/Kconfig +12 -0
@@ -24,6 +24,18 @@ config I2O If unsure, say N. +config I2O_LCT_NOTIFY_ON_CHANGES + bool "Enable LCT notification" + depends on I2O + default y + ---help--- + Only say N here if you have a I2O controller from SUN. The SUN + firmware doesn't support LCT notification on changes. If this option + is enabled on such a controller the driver will hang up in a endless + loop. On all other controllers say Y. + + If unsure, say Y. + config I2O_EXT_ADAPTEC bool "Enable Adaptec extensions" depends on I2O
drivers/message/i2o/device.c +61 -69
205 lines not on this page · raw message
drivers/message/i2o/exec-osm.c +9 -6
@@ -77,7 +77,7 @@ static struct i2o_exec_wait *i2o_exec_wa wait =kmalloc (sizeof (*wait),GFP_KERNEL );if (!wait) -return ERR_PTR (-ENOMEM ); +return NULL ;memset (wait,0 ,sizeof (*wait));
@@ -271,8 +271,8 @@ static ssize_t i2o_exec_show_vendor_id(sstruct i2o_device *dev =to_i2o_device (d);u16 id; -if (i2o_parm_field_get (dev,0x0000 ,0 , &id,2 )) { -sprintf (buf,"0x%04x" , id); +if (!i2o_parm_field_get (dev,0x0000 ,0 , &id,2 )) { +sprintf (buf,"0x%04x" ,le16_to_cpu (id));return strlen (buf) +1 ; }
@@ -293,8 +293,8 @@ static ssize_t i2o_exec_show_product_id(struct i2o_device *dev =to_i2o_device (d);u16 id; -if (i2o_parm_field_get (dev,0x0000 ,1 , &id,2 )) { -sprintf (buf,"0x%04x" , id); +if (!i2o_parm_field_get (dev,0x0000 ,1 , &id,2 )) { +sprintf (buf,"0x%04x" ,le16_to_cpu (id));return strlen (buf) +1 ; }
@@ -364,7 +364,9 @@ static void i2o_exec_lct_modified(structif (i2o_device_parse_lct (c) != -EAGAIN ) change_ind = c->lct->change_ind +1 ; +#ifdef CONFIG_I2O_LCT_NOTIFY_ON_CHANGES i2o_exec_lct_notify (c, change_ind); +#endif };/**
@@ -512,7 +514,8 @@ static int i2o_exec_lct_notify(struct i2 dev = &c->pdev->dev; -if (i2o_dma_realloc (dev, &c->dlct, sb->expected_lct_size,GFP_KERNEL )) +if (i2o_dma_realloc + (dev, &c->dlct,le32_to_cpu (sb->expected_lct_size),GFP_KERNEL ))return -ENOMEM ; msg =i2o_msg_get_wait (c,I2O_TIMEOUT_MESSAGE_GET );
drivers/message/i2o/i2o_block.c +9 -11
@@ -1050,8 +1050,8 @@ static int i2o_block_probe(struct deviceint rc;u64 size;u32 blocksize; -u32 flags, status;u16 body_size =4 ; +u16 power;unsigned short max_sectors;#ifdef CONFIG_I2O_EXT_ADAPTEC
@@ -1109,22 +1109,20 @@ static int i2o_block_probe(struct device* Ask for the current media data. If that isn't supported * then we ask for the device capacity data */ -if (i2o_parm_field_get (i2o_dev,0x0004 ,1 , &blocksize,4 ) || -i2o_parm_field_get (i2o_dev,0x0000 ,3 , &blocksize,4 )) { -blk_queue_hardsect_size (queue, blocksize); +if (!i2o_parm_field_get (i2o_dev,0x0004 ,1 , &blocksize,4 ) || + !i2o_parm_field_get (i2o_dev,0x0000 ,3 , &blocksize,4 )) { +blk_queue_hardsect_size (queue,le32_to_cpu (blocksize)); }else osm_warn ("unable to get blocksize of %s\n" , gd->disk_name); -if (i2o_parm_field_get (i2o_dev,0x0004 ,0 , &size,8 ) || -i2o_parm_field_get (i2o_dev,0x0000 ,4 , &size,8 )) { -set_capacity (gd, size >>KERNEL_SECTOR_SHIFT ); +if (!i2o_parm_field_get (i2o_dev,0x0004 ,0 , &size,8 ) || + !i2o_parm_field_get (i2o_dev,0x0000 ,4 , &size,8 )) { +set_capacity (gd,le64_to_cpu (size) >>KERNEL_SECTOR_SHIFT ); }else osm_warn ("could not get size of %s\n" , gd->disk_name); -if (!i2o_parm_field_get (i2o_dev,0x0000 ,2 , &i2o_blk_dev->power,2 )) - i2o_blk_dev->power =0 ; -i2o_parm_field_get (i2o_dev,0x0000 ,5 , &flags,4 ); -i2o_parm_field_get (i2o_dev,0x0000 ,6 , &status,4 ); +if (!i2o_parm_field_get (i2o_dev,0x0000 ,2 , &power,2 )) + i2o_blk_dev->power = power;i2o_event_register (i2o_dev, &i2o_block_driver,0 ,0xffffffff );
drivers/message/i2o/i2o_scsi.c +20 -15
@@ -113,7 +113,7 @@ static struct i2o_scsi_host *i2o_scsi_holist_for_each_entry (i2o_dev, &c->devices, list)if (i2o_dev->lct_data.class_id ==I2O_CLASS_BUS_ADAPTER ) { -if (i2o_parm_field_get (i2o_dev,0x0000 ,0 , &type,1 ) +if (!i2o_parm_field_get (i2o_dev,0x0000 ,0 , &type,1 ) && (type ==0x01 ))/* SCSI bus */ max_channel++; }
@@ -146,7 +146,7 @@ static struct i2o_scsi_host *i2o_scsi_ho i =0 ;list_for_each_entry (i2o_dev, &c->devices, list)if (i2o_dev->lct_data.class_id ==I2O_CLASS_BUS_ADAPTER ) { -if (i2o_parm_field_get (i2o_dev,0x0000 ,0 , &type,1 ) +if (!i2o_parm_field_get (i2o_dev,0x0000 ,0 , &type,1 ) && (type ==0x01 ))/* only SCSI bus */ i2o_shost->channel[i++] = i2o_dev;
@@ -238,13 +238,15 @@ static int i2o_scsi_probe(struct deviceu8 type;struct i2o_device *d = i2o_shost->channel[0 ]; -if (i2o_parm_field_get (d,0x0000 ,0 , &type,1 ) +if (!i2o_parm_field_get (d,0x0000 ,0 , &type,1 ) && (type ==0x01 ))/* SCSI bus */ -if (i2o_parm_field_get (d,0x0200 ,4 , &id,4 )) { +if (!i2o_parm_field_get (d,0x0200 ,4 , &id,4 )) { channel =0 ;if (i2o_dev->lct_data.class_id ==I2O_CLASS_RANDOM_BLOCK_STORAGE ) - lun = i2o_shost->lun++; + lun = +cpu_to_le64 (i2o_shost-> + lun++);else lun =0 ; }
@@ -253,10 +255,10 @@ static int i2o_scsi_probe(struct devicebreak ;case I2O_CLASS_SCSI_PERIPHERAL : -if (i2o_parm_field_get (i2o_dev,0x0000 ,3 , &id,4 ) <0 ) +if (i2o_parm_field_get (i2o_dev,0x0000 ,3 , &id,4 ))return -EFAULT ; -if (i2o_parm_field_get (i2o_dev,0x0000 ,4 , &lun,8 ) <0 ) +if (i2o_parm_field_get (i2o_dev,0x0000 ,4 , &lun,8 ))return -EFAULT ; parent =i2o_iop_find_device (c, i2o_dev->lct_data.parent_tid);
@@ -281,20 +283,22 @@ static int i2o_scsi_probe(struct devicereturn -EFAULT ; } -if (id >= scsi_host->max_id) { -osm_warn ("SCSI device id (%d) >= max_id of I2O host (%d)" , id, - scsi_host->max_id); +if (le32_to_cpu (id) >= scsi_host->max_id) { +osm_warn ("SCSI device id (%d) >= max_id of I2O host (%d)" , +le32_to_cpu (id), scsi_host->max_id);return -EFAULT ; } -if (lun >= scsi_host->max_lun) { -osm_warn ("SCSI device id (%d) >= max_lun of I2O host (%d)" , - (unsigned int )lun, scsi_host->max_lun); +if (le64_to_cpu (lun) >= scsi_host->max_lun) { +osm_warn ("SCSI device lun (%lu) >= max_lun of I2O host (%d)" , + (long unsigned int )le64_to_cpu (lun), + scsi_host->max_lun);return -EFAULT ; } scsi_dev = -__scsi_add_device (i2o_shost->scsi_host, channel, id, lun, i2o_dev); +__scsi_add_device (i2o_shost->scsi_host, channel,le32_to_cpu (id), +le64_to_cpu (lun), i2o_dev);if (IS_ERR (scsi_dev)) { osm_warn("can not add SCSI device %03x\n",
@@ -306,7 +310,8 @@ static int i2o_scsi_probe(struct device "scsi");osm_info ("device added (TID: %03x) channel: %d, id: %d, lun: %d\n" , - i2o_dev->lct_data.tid, channel, id, (unsigned int )lun); + i2o_dev->lct_data.tid, channel,le32_to_cpu (id), + (unsigned int )le64_to_cpu (lun));return 0 ; };
Quoted 3 lines · Markus Lidel
Changes:
--------
- Fixed lot of BE <-> LE bugs which prevent it from working on SPARC.
this doesn't match the patch, which introduces a config option aswell.