diff --git a/drivers/scsi/eata.c b/drivers/scsi/eata.c index 9690e38bed42a6ecaa164a4e4689d9c0f3efec5e..6cc11d8fc2014ec96e0dee45e709e6d6b26d0761 100644 --- a/drivers/scsi/eata.c +++ b/drivers/scsi/eata.c @@ -750,63 +750,34 @@ static int max_queue_depth = CONFIG_SCSI_EATA_MAX_TAGS; static int max_queue_depth = MAX_CMD_PER_LUN; #endif -static void select_queue_depths(struct Scsi_Host *host, Scsi_Device *devlist) { - Scsi_Device *dev; - int j, ntag = 0, nuntag = 0, tqd, utqd; +static int eata2x_slave_attach(Scsi_Device *dev) { + int j, tqd, utqd; + char *link_suffix = ""; + struct Scsi_Host *host = dev->host; j = ((struct hostdata *) host->hostdata)->board_number; - for(dev = devlist; dev; dev = dev->next) { - - if (dev->host != host) continue; - - if (TLDEV(dev->type) && (dev->tagged_supported || linked_comm)) - ntag++; - else - nuntag++; - } - utqd = MAX_CMD_PER_LUN; + tqd = (host->can_queue - utqd); - tqd = (host->can_queue - utqd * nuntag) / (ntag ? ntag : 1); - - if (tqd > max_queue_depth) tqd = max_queue_depth; - - if (tqd < MAX_CMD_PER_LUN) tqd = MAX_CMD_PER_LUN; - - for(dev = devlist; dev; dev = dev->next) { - char *tag_suffix = "", *link_suffix = ""; - - if (dev->host != host) continue; - - if (TLDEV(dev->type) && (dev->tagged_supported || linked_comm)) - dev->queue_depth = tqd; + if (TLDEV(dev->type) && (dev->tagged_supported || linked_comm)) { + if(!dev->tagged_supported) + scsi_adjust_queue_depth(dev, 0, tqd); else - dev->queue_depth = utqd; - - if (TLDEV(dev->type)) { - if (linked_comm && dev->queue_depth > 2) - link_suffix = ", sorted"; - else - link_suffix = ", unsorted"; - } - - if (tagged_comm && dev->tagged_supported && TLDEV(dev->type)) { - dev->tagged_queue = 1; - dev->current_tag = 1; - } - - if (dev->tagged_supported && TLDEV(dev->type) && dev->tagged_queue) - tag_suffix = ", soft-tagged"; - else if (dev->tagged_supported && TLDEV(dev->type)) - tag_suffix = ", tagged"; + scsi_adjust_queue_depth(dev, MSG_SIMPLE_TAG, tqd); + } else { + scsi_adjust_queue_depth(dev, 0, utqd); + } - printk("%s: scsi%d, channel %d, id %d, lun %d, cmds/lun %d%s%s.\n", - BN(j), host->host_no, dev->channel, dev->id, dev->lun, - dev->queue_depth, link_suffix, tag_suffix); - } + if (!dev->simple_tags && dev->new_queue_depth > 2) + link_suffix = ", sorted"; + else if (dev->simple_tags) + link_suffix = ", unsorted"; - return; + printk("%s: scsi%d, channel %d, id %d, lun %d, cmds/lun %d%s.\n", + BN(j), host->host_no, dev->channel, dev->id, dev->lun, + dev->new_queue_depth, link_suffix); + return 0; } static inline int wait_on_busy(unsigned long iobase, unsigned int loop) { @@ -1071,7 +1042,6 @@ static inline int port_detect \ sh[j]->this_id = (ushort) info.host_addr[3]; sh[j]->can_queue = (ushort) be16_to_cpu(info.queue_size); sh[j]->cmd_per_lun = MAX_CMD_PER_LUN; - sh[j]->select_queue_depths = select_queue_depths; memset(HD(j), 0, sizeof(struct hostdata)); HD(j)->subversion = subversion; HD(j)->protocol_rev = protocol_rev; @@ -1542,7 +1512,7 @@ static inline int do_qcomm(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) { /* Map DMA buffers and SG list */ map_dma(i, j); - if (SCpnt->device->tagged_queue) { + if (SCpnt->device->simple_tags) { if (HD(j)->target_redo[SCpnt->target][SCpnt->channel] || HD(j)->target_to[SCpnt->target][SCpnt->channel]) @@ -1560,8 +1530,7 @@ static inline int do_qcomm(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) { cpp->mess[1] = SCpnt->device->current_tag++; } - if (linked_comm && SCpnt->device->queue_depth > 2 - && TLDEV(SCpnt->device->type)) { + if (SCpnt->device->queue_depth > 2 && !SCpnt->device->simple_tags) { HD(j)->cp_stat[i] = READY; flush_dev(SCpnt->device, SCpnt->request->sector, j, FALSE); return 0; diff --git a/drivers/scsi/eata.h b/drivers/scsi/eata.h index 56f00bf01c7bca195e4ad228a03afeb1d44311c8..471e51ebfb55be6f26dfddf6d64f15576dffa522 100644 --- a/drivers/scsi/eata.h +++ b/drivers/scsi/eata.h @@ -12,6 +12,7 @@ int eata2x_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); int eata2x_abort(Scsi_Cmnd *); int eata2x_reset(Scsi_Cmnd *); int eata2x_biosparam(Disk *, struct block_device *, int *); +static int eata2x_slave_attach(Scsi_Device *); #define EATA_VERSION "7.22.00" @@ -27,6 +28,7 @@ int eata2x_biosparam(Disk *, struct block_device *, int *); eh_bus_reset_handler: NULL, \ eh_host_reset_handler: eata2x_reset, \ bios_param: eata2x_biosparam, \ + slave_attach: eata2x_slave_attach, \ this_id: 7, \ unchecked_isa_dma: 1, \ use_clustering: ENABLE_CLUSTERING, \