[SCSI] aacraid: Added Sync.mode to support series 7/8/9 controllers
[firefly-linux-kernel-4.4.55.git] / drivers / scsi / aacraid / comminit.c
index 7ac8fdb5577b2cc922bb15a8737eea1ff3751cfa..a35f54ebdce003509864280f437fa50bf7c371da 100644 (file)
@@ -325,12 +325,14 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
 {
        u32 status[5];
        struct Scsi_Host * host = dev->scsi_host_ptr;
+       extern int aac_sync_mode;
 
        /*
         *      Check the preferred comm settings, defaults from template.
         */
        dev->management_fib_count = 0;
        spin_lock_init(&dev->manage_lock);
+       spin_lock_init(&dev->sync_lock);
        dev->max_fib_size = sizeof(struct hw_fib);
        dev->sg_tablesize = host->sg_tablesize = (dev->max_fib_size
                - sizeof(struct aac_fibhdr)
@@ -344,13 +346,21 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
                        (status[0] == 0x00000001)) {
                if (status[1] & le32_to_cpu(AAC_OPT_NEW_COMM_64))
                        dev->raw_io_64 = 1;
-               if (dev->a_ops.adapter_comm) {
-                       if (status[1] & le32_to_cpu(AAC_OPT_NEW_COMM_TYPE1)) {
-                               dev->comm_interface = AAC_COMM_MESSAGE_TYPE1;
-                               dev->raw_io_interface = 1;
-                       } else if (status[1] & le32_to_cpu(AAC_OPT_NEW_COMM)) {
+               dev->sync_mode = aac_sync_mode;
+               if (dev->a_ops.adapter_comm &&
+                       (status[1] & le32_to_cpu(AAC_OPT_NEW_COMM))) {
                                dev->comm_interface = AAC_COMM_MESSAGE;
                                dev->raw_io_interface = 1;
+                       if ((status[1] & le32_to_cpu(AAC_OPT_NEW_COMM_TYPE1))) {
+                               /* driver supports TYPE1 (Tupelo) */
+                               dev->comm_interface = AAC_COMM_MESSAGE_TYPE1;
+                       } else if ((status[1] & le32_to_cpu(AAC_OPT_NEW_COMM_TYPE4)) ||
+                                 (status[1] & le32_to_cpu(AAC_OPT_NEW_COMM_TYPE3)) ||
+                                 (status[1] & le32_to_cpu(AAC_OPT_NEW_COMM_TYPE2))) {
+                                       /* driver doesn't support TYPE2 (Series7), TYPE3 and TYPE4 */
+                                       /* switch to sync. mode */
+                                       dev->comm_interface = AAC_COMM_MESSAGE_TYPE1;
+                                       dev->sync_mode = 1;
                        }
                }
                if ((dev->comm_interface == AAC_COMM_MESSAGE) &&
@@ -455,6 +465,7 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
        }
                
        INIT_LIST_HEAD(&dev->fib_list);
+       INIT_LIST_HEAD(&dev->sync_fib_list);
 
        return dev;
 }