linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / scsi / aacraid / comminit.c
index 1cd3584..1628d09 100644 (file)
@@ -92,7 +92,28 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co
        init->AdapterFibsPhysicalAddress = cpu_to_le32((u32)phys);
        init->AdapterFibsSize = cpu_to_le32(fibsize);
        init->AdapterFibAlign = cpu_to_le32(sizeof(struct hw_fib));
-       init->HostPhysMemPages = cpu_to_le32(AAC_MAX_HOSTPHYSMEMPAGES);
+       /* 
+        * number of 4k pages of host physical memory. The aacraid fw needs
+        * this number to be less than 4gb worth of pages. num_physpages is in
+        * system page units. New firmware doesn't have any issues with the
+        * mapping system, but older Firmware did, and had *troubles* dealing
+        * with the math overloading past 32 bits, thus we must limit this
+        * field.
+        *
+        * This assumes the memory is mapped zero->n, which isnt
+        * always true on real computers. It also has some slight problems
+        * with the GART on x86-64. I've btw never tried DMA from PCI space
+        * on this platform but don't be suprised if its problematic.
+        */
+#ifndef CONFIG_GART_IOMMU
+       if ((num_physpages << (PAGE_SHIFT - 12)) <= AAC_MAX_HOSTPHYSMEMPAGES) {
+               init->HostPhysMemPages = 
+                       cpu_to_le32(num_physpages << (PAGE_SHIFT-12));
+       } else 
+#endif 
+       {
+               init->HostPhysMemPages = cpu_to_le32(AAC_MAX_HOSTPHYSMEMPAGES);
+       }
 
        init->InitFlags = 0;
        if (dev->new_comm_interface) {
@@ -138,6 +159,7 @@ static void aac_queue_init(struct aac_dev * dev, struct aac_queue * q, u32 *mem,
 {
        q->numpending = 0;
        q->dev = dev;
+       INIT_LIST_HEAD(&q->pendingq);
        init_waitqueue_head(&q->cmdready);
        INIT_LIST_HEAD(&q->cmdq);
        init_waitqueue_head(&q->qfull);
@@ -411,6 +433,7 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
        }
                
        INIT_LIST_HEAD(&dev->fib_list);
+       init_completion(&dev->aif_completion);
 
        return dev;
 }