[SCSI] stex: adjust default queue length
authorEd Lin <ed.lin@promise.com>
Tue, 5 Dec 2006 01:49:34 +0000 (17:49 -0800)
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>
Tue, 5 Dec 2006 17:32:46 +0000 (11:32 -0600)
Firmware of new version may adjust default queue length. It is
backward compatible.

Signed-off-by: Ed Lin <ed.lin@promise.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/scsi/stex.c

index 92dbac03c2e54c20f701983bad9efb6cd332e4f5..a20cbd9d325a687279c2b634b517bc711e0887f2 100644 (file)
@@ -78,6 +78,7 @@ enum {
 
        MU_MAX_DELAY_TIME                       = 240000,
        MU_HANDSHAKE_SIGNATURE                  = 0x55aaaa55,
+       MU_HANDSHAKE_SIGNATURE_HALF             = 0x5a5a0000,
        HMU_PARTNER_TYPE                        = 2,
 
        /* firmware returned values */
@@ -902,6 +903,7 @@ static int stex_handshake(struct st_hba *hba)
        void __iomem *base = hba->mmio_base;
        struct handshake_frame *h;
        dma_addr_t status_phys;
+       u32 data;
        int i;
 
        if (readl(base + OMR0) != MU_HANDSHAKE_SIGNATURE) {
@@ -923,6 +925,13 @@ static int stex_handshake(struct st_hba *hba)
 
        udelay(10);
 
+       data = readl(base + OMR1);
+       if ((data & 0xffff0000) == MU_HANDSHAKE_SIGNATURE_HALF) {
+               data &= 0x0000ffff;
+               if (hba->host->can_queue > data)
+                       hba->host->can_queue = data;
+       }
+
        h = (struct handshake_frame *)(hba->dma_mem + MU_REQ_BUFFER_SIZE);
        h->rb_phy = cpu_to_le32(hba->dma_handle);
        h->rb_phy_hi = cpu_to_le32((hba->dma_handle >> 16) >> 16);
@@ -1234,7 +1243,7 @@ stex_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        if (err)
                goto out_free_irq;
 
-       err = scsi_init_shared_tag_map(host, ST_CAN_QUEUE);
+       err = scsi_init_shared_tag_map(host, host->can_queue);
        if (err) {
                printk(KERN_ERR DRV_NAME "(%s): init shared queue failed\n",
                        pci_name(pdev));