Merge tag 'v4.3-rc3' into next
[cascardo/linux.git] / drivers / scsi / aic94xx / aic94xx_init.c
1 /*
2  * Aic94xx SAS/SATA driver initialization.
3  *
4  * Copyright (C) 2005 Adaptec, Inc.  All rights reserved.
5  * Copyright (C) 2005 Luben Tuikov <luben_tuikov@adaptec.com>
6  *
7  * This file is licensed under GPLv2.
8  *
9  * This file is part of the aic94xx driver.
10  *
11  * The aic94xx driver is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License as
13  * published by the Free Software Foundation; version 2 of the
14  * License.
15  *
16  * The aic94xx driver is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with the aic94xx driver; if not, write to the Free Software
23  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
24  *
25  */
26
27 #include <linux/module.h>
28 #include <linux/init.h>
29 #include <linux/kernel.h>
30 #include <linux/pci.h>
31 #include <linux/delay.h>
32 #include <linux/firmware.h>
33 #include <linux/slab.h>
34
35 #include <scsi/scsi_host.h>
36
37 #include "aic94xx.h"
38 #include "aic94xx_reg.h"
39 #include "aic94xx_hwi.h"
40 #include "aic94xx_seq.h"
41 #include "aic94xx_sds.h"
42
43 /* The format is "version.release.patchlevel" */
44 #define ASD_DRIVER_VERSION "1.0.3"
45
46 static int use_msi = 0;
47 module_param_named(use_msi, use_msi, int, S_IRUGO);
48 MODULE_PARM_DESC(use_msi, "\n"
49         "\tEnable(1) or disable(0) using PCI MSI.\n"
50         "\tDefault: 0");
51
52 static struct scsi_transport_template *aic94xx_transport_template;
53 static int asd_scan_finished(struct Scsi_Host *, unsigned long);
54 static void asd_scan_start(struct Scsi_Host *);
55
56 static struct scsi_host_template aic94xx_sht = {
57         .module                 = THIS_MODULE,
58         /* .name is initialized */
59         .name                   = "aic94xx",
60         .queuecommand           = sas_queuecommand,
61         .target_alloc           = sas_target_alloc,
62         .slave_configure        = sas_slave_configure,
63         .scan_finished          = asd_scan_finished,
64         .scan_start             = asd_scan_start,
65         .change_queue_depth     = sas_change_queue_depth,
66         .bios_param             = sas_bios_param,
67         .can_queue              = 1,
68         .this_id                = -1,
69         .sg_tablesize           = SG_ALL,
70         .max_sectors            = SCSI_DEFAULT_MAX_SECTORS,
71         .use_clustering         = ENABLE_CLUSTERING,
72         .eh_device_reset_handler        = sas_eh_device_reset_handler,
73         .eh_bus_reset_handler   = sas_eh_bus_reset_handler,
74         .target_destroy         = sas_target_destroy,
75         .ioctl                  = sas_ioctl,
76         .use_blk_tags           = 1,
77         .track_queue_depth      = 1,
78 };
79
80 static int asd_map_memio(struct asd_ha_struct *asd_ha)
81 {
82         int err, i;
83         struct asd_ha_addrspace *io_handle;
84
85         asd_ha->iospace = 0;
86         for (i = 0; i < 3; i += 2) {
87                 io_handle = &asd_ha->io_handle[i==0?0:1];
88                 io_handle->start = pci_resource_start(asd_ha->pcidev, i);
89                 io_handle->len   = pci_resource_len(asd_ha->pcidev, i);
90                 io_handle->flags = pci_resource_flags(asd_ha->pcidev, i);
91                 err = -ENODEV;
92                 if (!io_handle->start || !io_handle->len) {
93                         asd_printk("MBAR%d start or length for %s is 0.\n",
94                                    i==0?0:1, pci_name(asd_ha->pcidev));
95                         goto Err;
96                 }
97                 err = pci_request_region(asd_ha->pcidev, i, ASD_DRIVER_NAME);
98                 if (err) {
99                         asd_printk("couldn't reserve memory region for %s\n",
100                                    pci_name(asd_ha->pcidev));
101                         goto Err;
102                 }
103                 io_handle->addr = ioremap(io_handle->start, io_handle->len);
104                 if (!io_handle->addr) {
105                         asd_printk("couldn't map MBAR%d of %s\n", i==0?0:1,
106                                    pci_name(asd_ha->pcidev));
107                         err = -ENOMEM;
108                         goto Err_unreq;
109                 }
110         }
111
112         return 0;
113 Err_unreq:
114         pci_release_region(asd_ha->pcidev, i);
115 Err:
116         if (i > 0) {
117                 io_handle = &asd_ha->io_handle[0];
118                 iounmap(io_handle->addr);
119                 pci_release_region(asd_ha->pcidev, 0);
120         }
121         return err;
122 }
123
124 static void asd_unmap_memio(struct asd_ha_struct *asd_ha)
125 {
126         struct asd_ha_addrspace *io_handle;
127
128         io_handle = &asd_ha->io_handle[1];
129         iounmap(io_handle->addr);
130         pci_release_region(asd_ha->pcidev, 2);
131
132         io_handle = &asd_ha->io_handle[0];
133         iounmap(io_handle->addr);
134         pci_release_region(asd_ha->pcidev, 0);
135 }
136
137 static int asd_map_ioport(struct asd_ha_struct *asd_ha)
138 {
139         int i = PCI_IOBAR_OFFSET, err;
140         struct asd_ha_addrspace *io_handle = &asd_ha->io_handle[0];
141
142         asd_ha->iospace = 1;
143         io_handle->start = pci_resource_start(asd_ha->pcidev, i);
144         io_handle->len   = pci_resource_len(asd_ha->pcidev, i);
145         io_handle->flags = pci_resource_flags(asd_ha->pcidev, i);
146         io_handle->addr  = (void __iomem *) io_handle->start;
147         if (!io_handle->start || !io_handle->len) {
148                 asd_printk("couldn't get IO ports for %s\n",
149                            pci_name(asd_ha->pcidev));
150                 return -ENODEV;
151         }
152         err = pci_request_region(asd_ha->pcidev, i, ASD_DRIVER_NAME);
153         if (err) {
154                 asd_printk("couldn't reserve io space for %s\n",
155                            pci_name(asd_ha->pcidev));
156         }
157
158         return err;
159 }
160
161 static void asd_unmap_ioport(struct asd_ha_struct *asd_ha)
162 {
163         pci_release_region(asd_ha->pcidev, PCI_IOBAR_OFFSET);
164 }
165
166 static int asd_map_ha(struct asd_ha_struct *asd_ha)
167 {
168         int err;
169         u16 cmd_reg;
170
171         err = pci_read_config_word(asd_ha->pcidev, PCI_COMMAND, &cmd_reg);
172         if (err) {
173                 asd_printk("couldn't read command register of %s\n",
174                            pci_name(asd_ha->pcidev));
175                 goto Err;
176         }
177
178         err = -ENODEV;
179         if (cmd_reg & PCI_COMMAND_MEMORY) {
180                 if ((err = asd_map_memio(asd_ha)))
181                         goto Err;
182         } else if (cmd_reg & PCI_COMMAND_IO) {
183                 if ((err = asd_map_ioport(asd_ha)))
184                         goto Err;
185                 asd_printk("%s ioport mapped -- upgrade your hardware\n",
186                            pci_name(asd_ha->pcidev));
187         } else {
188                 asd_printk("no proper device access to %s\n",
189                            pci_name(asd_ha->pcidev));
190                 goto Err;
191         }
192
193         return 0;
194 Err:
195         return err;
196 }
197
198 static void asd_unmap_ha(struct asd_ha_struct *asd_ha)
199 {
200         if (asd_ha->iospace)
201                 asd_unmap_ioport(asd_ha);
202         else
203                 asd_unmap_memio(asd_ha);
204 }
205
206 static const char *asd_dev_rev[30] = {
207         [0] = "A0",
208         [1] = "A1",
209         [8] = "B0",
210 };
211
212 static int asd_common_setup(struct asd_ha_struct *asd_ha)
213 {
214         int err, i;
215
216         asd_ha->revision_id = asd_ha->pcidev->revision;
217
218         err = -ENODEV;
219         if (asd_ha->revision_id < AIC9410_DEV_REV_B0) {
220                 asd_printk("%s is revision %s (%X), which is not supported\n",
221                            pci_name(asd_ha->pcidev),
222                            asd_dev_rev[asd_ha->revision_id],
223                            asd_ha->revision_id);
224                 goto Err;
225         }
226         /* Provide some sane default values. */
227         asd_ha->hw_prof.max_scbs = 512;
228         asd_ha->hw_prof.max_ddbs = ASD_MAX_DDBS;
229         asd_ha->hw_prof.num_phys = ASD_MAX_PHYS;
230         /* All phys are enabled, by default. */
231         asd_ha->hw_prof.enabled_phys = 0xFF;
232         for (i = 0; i < ASD_MAX_PHYS; i++) {
233                 asd_ha->hw_prof.phy_desc[i].max_sas_lrate =
234                         SAS_LINK_RATE_3_0_GBPS;
235                 asd_ha->hw_prof.phy_desc[i].min_sas_lrate =
236                         SAS_LINK_RATE_1_5_GBPS;
237                 asd_ha->hw_prof.phy_desc[i].max_sata_lrate =
238                         SAS_LINK_RATE_1_5_GBPS;
239                 asd_ha->hw_prof.phy_desc[i].min_sata_lrate =
240                         SAS_LINK_RATE_1_5_GBPS;
241         }
242
243         return 0;
244 Err:
245         return err;
246 }
247
248 static int asd_aic9410_setup(struct asd_ha_struct *asd_ha)
249 {
250         int err = asd_common_setup(asd_ha);
251
252         if (err)
253                 return err;
254
255         asd_ha->hw_prof.addr_range = 8;
256         asd_ha->hw_prof.port_name_base = 0;
257         asd_ha->hw_prof.dev_name_base = 8;
258         asd_ha->hw_prof.sata_name_base = 16;
259
260         return 0;
261 }
262
263 static int asd_aic9405_setup(struct asd_ha_struct *asd_ha)
264 {
265         int err = asd_common_setup(asd_ha);
266
267         if (err)
268                 return err;
269
270         asd_ha->hw_prof.addr_range = 4;
271         asd_ha->hw_prof.port_name_base = 0;
272         asd_ha->hw_prof.dev_name_base = 4;
273         asd_ha->hw_prof.sata_name_base = 8;
274
275         return 0;
276 }
277
278 static ssize_t asd_show_dev_rev(struct device *dev,
279                                 struct device_attribute *attr, char *buf)
280 {
281         struct asd_ha_struct *asd_ha = dev_to_asd_ha(dev);
282         return snprintf(buf, PAGE_SIZE, "%s\n",
283                         asd_dev_rev[asd_ha->revision_id]);
284 }
285 static DEVICE_ATTR(revision, S_IRUGO, asd_show_dev_rev, NULL);
286
287 static ssize_t asd_show_dev_bios_build(struct device *dev,
288                                        struct device_attribute *attr,char *buf)
289 {
290         struct asd_ha_struct *asd_ha = dev_to_asd_ha(dev);
291         return snprintf(buf, PAGE_SIZE, "%d\n", asd_ha->hw_prof.bios.bld);
292 }
293 static DEVICE_ATTR(bios_build, S_IRUGO, asd_show_dev_bios_build, NULL);
294
295 static ssize_t asd_show_dev_pcba_sn(struct device *dev,
296                                     struct device_attribute *attr, char *buf)
297 {
298         struct asd_ha_struct *asd_ha = dev_to_asd_ha(dev);
299         return snprintf(buf, PAGE_SIZE, "%s\n", asd_ha->hw_prof.pcba_sn);
300 }
301 static DEVICE_ATTR(pcba_sn, S_IRUGO, asd_show_dev_pcba_sn, NULL);
302
303 #define FLASH_CMD_NONE      0x00
304 #define FLASH_CMD_UPDATE    0x01
305 #define FLASH_CMD_VERIFY    0x02
306
307 struct flash_command {
308      u8      command[8];
309      int     code;
310 };
311
312 static struct flash_command flash_command_table[] =
313 {
314      {"verify",      FLASH_CMD_VERIFY},
315      {"update",      FLASH_CMD_UPDATE},
316      {"",            FLASH_CMD_NONE}      /* Last entry should be NULL. */
317 };
318
319 struct error_bios {
320      char    *reason;
321      int     err_code;
322 };
323
324 static struct error_bios flash_error_table[] =
325 {
326      {"Failed to open bios image file",      FAIL_OPEN_BIOS_FILE},
327      {"PCI ID mismatch",                     FAIL_CHECK_PCI_ID},
328      {"Checksum mismatch",                   FAIL_CHECK_SUM},
329      {"Unknown Error",                       FAIL_UNKNOWN},
330      {"Failed to verify.",                   FAIL_VERIFY},
331      {"Failed to reset flash chip.",         FAIL_RESET_FLASH},
332      {"Failed to find flash chip type.",     FAIL_FIND_FLASH_ID},
333      {"Failed to erash flash chip.",         FAIL_ERASE_FLASH},
334      {"Failed to program flash chip.",       FAIL_WRITE_FLASH},
335      {"Flash in progress",                   FLASH_IN_PROGRESS},
336      {"Image file size Error",               FAIL_FILE_SIZE},
337      {"Input parameter error",               FAIL_PARAMETERS},
338      {"Out of memory",                       FAIL_OUT_MEMORY},
339      {"OK", 0}  /* Last entry err_code = 0. */
340 };
341
342 static ssize_t asd_store_update_bios(struct device *dev,
343         struct device_attribute *attr,
344         const char *buf, size_t count)
345 {
346         struct asd_ha_struct *asd_ha = dev_to_asd_ha(dev);
347         char *cmd_ptr, *filename_ptr;
348         struct bios_file_header header, *hdr_ptr;
349         int res, i;
350         u32 csum = 0;
351         int flash_command = FLASH_CMD_NONE;
352         int err = 0;
353
354         cmd_ptr = kzalloc(count*2, GFP_KERNEL);
355
356         if (!cmd_ptr) {
357                 err = FAIL_OUT_MEMORY;
358                 goto out;
359         }
360
361         filename_ptr = cmd_ptr + count;
362         res = sscanf(buf, "%s %s", cmd_ptr, filename_ptr);
363         if (res != 2) {
364                 err = FAIL_PARAMETERS;
365                 goto out1;
366         }
367
368         for (i = 0; flash_command_table[i].code != FLASH_CMD_NONE; i++) {
369                 if (!memcmp(flash_command_table[i].command,
370                                  cmd_ptr, strlen(cmd_ptr))) {
371                         flash_command = flash_command_table[i].code;
372                         break;
373                 }
374         }
375         if (flash_command == FLASH_CMD_NONE) {
376                 err = FAIL_PARAMETERS;
377                 goto out1;
378         }
379
380         if (asd_ha->bios_status == FLASH_IN_PROGRESS) {
381                 err = FLASH_IN_PROGRESS;
382                 goto out1;
383         }
384         err = request_firmware(&asd_ha->bios_image,
385                                    filename_ptr,
386                                    &asd_ha->pcidev->dev);
387         if (err) {
388                 asd_printk("Failed to load bios image file %s, error %d\n",
389                            filename_ptr, err);
390                 err = FAIL_OPEN_BIOS_FILE;
391                 goto out1;
392         }
393
394         hdr_ptr = (struct bios_file_header *)asd_ha->bios_image->data;
395
396         if ((hdr_ptr->contrl_id.vendor != asd_ha->pcidev->vendor ||
397                 hdr_ptr->contrl_id.device != asd_ha->pcidev->device) &&
398                 (hdr_ptr->contrl_id.sub_vendor != asd_ha->pcidev->vendor ||
399                 hdr_ptr->contrl_id.sub_device != asd_ha->pcidev->device)) {
400
401                 ASD_DPRINTK("The PCI vendor or device id does not match\n");
402                 ASD_DPRINTK("vendor=%x dev=%x sub_vendor=%x sub_dev=%x"
403                 " pci vendor=%x pci dev=%x\n",
404                 hdr_ptr->contrl_id.vendor,
405                 hdr_ptr->contrl_id.device,
406                 hdr_ptr->contrl_id.sub_vendor,
407                 hdr_ptr->contrl_id.sub_device,
408                 asd_ha->pcidev->vendor,
409                 asd_ha->pcidev->device);
410                 err = FAIL_CHECK_PCI_ID;
411                 goto out2;
412         }
413
414         if (hdr_ptr->filelen != asd_ha->bios_image->size) {
415                 err = FAIL_FILE_SIZE;
416                 goto out2;
417         }
418
419         /* calculate checksum */
420         for (i = 0; i < hdr_ptr->filelen; i++)
421                 csum += asd_ha->bios_image->data[i];
422
423         if ((csum & 0x0000ffff) != hdr_ptr->checksum) {
424                 ASD_DPRINTK("BIOS file checksum mismatch\n");
425                 err = FAIL_CHECK_SUM;
426                 goto out2;
427         }
428         if (flash_command == FLASH_CMD_UPDATE) {
429                 asd_ha->bios_status = FLASH_IN_PROGRESS;
430                 err = asd_write_flash_seg(asd_ha,
431                         &asd_ha->bios_image->data[sizeof(*hdr_ptr)],
432                         0, hdr_ptr->filelen-sizeof(*hdr_ptr));
433                 if (!err)
434                         err = asd_verify_flash_seg(asd_ha,
435                                 &asd_ha->bios_image->data[sizeof(*hdr_ptr)],
436                                 0, hdr_ptr->filelen-sizeof(*hdr_ptr));
437         } else {
438                 asd_ha->bios_status = FLASH_IN_PROGRESS;
439                 err = asd_verify_flash_seg(asd_ha,
440                         &asd_ha->bios_image->data[sizeof(header)],
441                         0, hdr_ptr->filelen-sizeof(header));
442         }
443
444 out2:
445         release_firmware(asd_ha->bios_image);
446 out1:
447         kfree(cmd_ptr);
448 out:
449         asd_ha->bios_status = err;
450
451         if (!err)
452                 return count;
453         else
454                 return -err;
455 }
456
457 static ssize_t asd_show_update_bios(struct device *dev,
458                                     struct device_attribute *attr, char *buf)
459 {
460         int i;
461         struct asd_ha_struct *asd_ha = dev_to_asd_ha(dev);
462
463         for (i = 0; flash_error_table[i].err_code != 0; i++) {
464                 if (flash_error_table[i].err_code == asd_ha->bios_status)
465                         break;
466         }
467         if (asd_ha->bios_status != FLASH_IN_PROGRESS)
468                 asd_ha->bios_status = FLASH_OK;
469
470         return snprintf(buf, PAGE_SIZE, "status=%x %s\n",
471                         flash_error_table[i].err_code,
472                         flash_error_table[i].reason);
473 }
474
475 static DEVICE_ATTR(update_bios, S_IRUGO|S_IWUSR,
476         asd_show_update_bios, asd_store_update_bios);
477
478 static int asd_create_dev_attrs(struct asd_ha_struct *asd_ha)
479 {
480         int err;
481
482         err = device_create_file(&asd_ha->pcidev->dev, &dev_attr_revision);
483         if (err)
484                 return err;
485
486         err = device_create_file(&asd_ha->pcidev->dev, &dev_attr_bios_build);
487         if (err)
488                 goto err_rev;
489
490         err = device_create_file(&asd_ha->pcidev->dev, &dev_attr_pcba_sn);
491         if (err)
492                 goto err_biosb;
493         err = device_create_file(&asd_ha->pcidev->dev, &dev_attr_update_bios);
494         if (err)
495                 goto err_update_bios;
496
497         return 0;
498
499 err_update_bios:
500         device_remove_file(&asd_ha->pcidev->dev, &dev_attr_pcba_sn);
501 err_biosb:
502         device_remove_file(&asd_ha->pcidev->dev, &dev_attr_bios_build);
503 err_rev:
504         device_remove_file(&asd_ha->pcidev->dev, &dev_attr_revision);
505         return err;
506 }
507
508 static void asd_remove_dev_attrs(struct asd_ha_struct *asd_ha)
509 {
510         device_remove_file(&asd_ha->pcidev->dev, &dev_attr_revision);
511         device_remove_file(&asd_ha->pcidev->dev, &dev_attr_bios_build);
512         device_remove_file(&asd_ha->pcidev->dev, &dev_attr_pcba_sn);
513         device_remove_file(&asd_ha->pcidev->dev, &dev_attr_update_bios);
514 }
515
516 /* The first entry, 0, is used for dynamic ids, the rest for devices
517  * we know about.
518  */
519 static const struct asd_pcidev_struct {
520         const char * name;
521         int (*setup)(struct asd_ha_struct *asd_ha);
522 } asd_pcidev_data[] = {
523         /* Id 0 is used for dynamic ids. */
524         { .name  = "Adaptec AIC-94xx SAS/SATA Host Adapter",
525           .setup = asd_aic9410_setup
526         },
527         { .name  = "Adaptec AIC-9410W SAS/SATA Host Adapter",
528           .setup = asd_aic9410_setup
529         },
530         { .name  = "Adaptec AIC-9405W SAS/SATA Host Adapter",
531           .setup = asd_aic9405_setup
532         },
533 };
534
535 static int asd_create_ha_caches(struct asd_ha_struct *asd_ha)
536 {
537         asd_ha->scb_pool = dma_pool_create(ASD_DRIVER_NAME "_scb_pool",
538                                            &asd_ha->pcidev->dev,
539                                            sizeof(struct scb),
540                                            8, 0);
541         if (!asd_ha->scb_pool) {
542                 asd_printk("couldn't create scb pool\n");
543                 return -ENOMEM;
544         }
545
546         return 0;
547 }
548
549 /**
550  * asd_free_edbs -- free empty data buffers
551  * asd_ha: pointer to host adapter structure
552  */
553 static void asd_free_edbs(struct asd_ha_struct *asd_ha)
554 {
555         struct asd_seq_data *seq = &asd_ha->seq;
556         int i;
557
558         for (i = 0; i < seq->num_edbs; i++)
559                 asd_free_coherent(asd_ha, seq->edb_arr[i]);
560         kfree(seq->edb_arr);
561         seq->edb_arr = NULL;
562 }
563
564 static void asd_free_escbs(struct asd_ha_struct *asd_ha)
565 {
566         struct asd_seq_data *seq = &asd_ha->seq;
567         int i;
568
569         for (i = 0; i < seq->num_escbs; i++) {
570                 if (!list_empty(&seq->escb_arr[i]->list))
571                         list_del_init(&seq->escb_arr[i]->list);
572
573                 asd_ascb_free(seq->escb_arr[i]);
574         }
575         kfree(seq->escb_arr);
576         seq->escb_arr = NULL;
577 }
578
579 static void asd_destroy_ha_caches(struct asd_ha_struct *asd_ha)
580 {
581         int i;
582
583         if (asd_ha->hw_prof.ddb_ext)
584                 asd_free_coherent(asd_ha, asd_ha->hw_prof.ddb_ext);
585         if (asd_ha->hw_prof.scb_ext)
586                 asd_free_coherent(asd_ha, asd_ha->hw_prof.scb_ext);
587
588         if (asd_ha->hw_prof.ddb_bitmap)
589                 kfree(asd_ha->hw_prof.ddb_bitmap);
590         asd_ha->hw_prof.ddb_bitmap = NULL;
591
592         for (i = 0; i < ASD_MAX_PHYS; i++) {
593                 struct asd_phy *phy = &asd_ha->phys[i];
594
595                 asd_free_coherent(asd_ha, phy->id_frm_tok);
596         }
597         if (asd_ha->seq.escb_arr)
598                 asd_free_escbs(asd_ha);
599         if (asd_ha->seq.edb_arr)
600                 asd_free_edbs(asd_ha);
601         if (asd_ha->hw_prof.ue.area) {
602                 kfree(asd_ha->hw_prof.ue.area);
603                 asd_ha->hw_prof.ue.area = NULL;
604         }
605         if (asd_ha->seq.tc_index_array) {
606                 kfree(asd_ha->seq.tc_index_array);
607                 kfree(asd_ha->seq.tc_index_bitmap);
608                 asd_ha->seq.tc_index_array = NULL;
609                 asd_ha->seq.tc_index_bitmap = NULL;
610         }
611         if (asd_ha->seq.actual_dl) {
612                         asd_free_coherent(asd_ha, asd_ha->seq.actual_dl);
613                         asd_ha->seq.actual_dl = NULL;
614                         asd_ha->seq.dl = NULL;
615         }
616         if (asd_ha->seq.next_scb.vaddr) {
617                 dma_pool_free(asd_ha->scb_pool, asd_ha->seq.next_scb.vaddr,
618                               asd_ha->seq.next_scb.dma_handle);
619                 asd_ha->seq.next_scb.vaddr = NULL;
620         }
621         dma_pool_destroy(asd_ha->scb_pool);
622         asd_ha->scb_pool = NULL;
623 }
624
625 struct kmem_cache *asd_dma_token_cache;
626 struct kmem_cache *asd_ascb_cache;
627
628 static int asd_create_global_caches(void)
629 {
630         if (!asd_dma_token_cache) {
631                 asd_dma_token_cache
632                         = kmem_cache_create(ASD_DRIVER_NAME "_dma_token",
633                                             sizeof(struct asd_dma_tok),
634                                             0,
635                                             SLAB_HWCACHE_ALIGN,
636                                             NULL);
637                 if (!asd_dma_token_cache) {
638                         asd_printk("couldn't create dma token cache\n");
639                         return -ENOMEM;
640                 }
641         }
642
643         if (!asd_ascb_cache) {
644                 asd_ascb_cache = kmem_cache_create(ASD_DRIVER_NAME "_ascb",
645                                                    sizeof(struct asd_ascb),
646                                                    0,
647                                                    SLAB_HWCACHE_ALIGN,
648                                                    NULL);
649                 if (!asd_ascb_cache) {
650                         asd_printk("couldn't create ascb cache\n");
651                         goto Err;
652                 }
653         }
654
655         return 0;
656 Err:
657         kmem_cache_destroy(asd_dma_token_cache);
658         asd_dma_token_cache = NULL;
659         return -ENOMEM;
660 }
661
662 static void asd_destroy_global_caches(void)
663 {
664         if (asd_dma_token_cache)
665                 kmem_cache_destroy(asd_dma_token_cache);
666         asd_dma_token_cache = NULL;
667
668         if (asd_ascb_cache)
669                 kmem_cache_destroy(asd_ascb_cache);
670         asd_ascb_cache = NULL;
671 }
672
673 static int asd_register_sas_ha(struct asd_ha_struct *asd_ha)
674 {
675         int i;
676         struct asd_sas_phy   **sas_phys =
677                 kcalloc(ASD_MAX_PHYS, sizeof(*sas_phys), GFP_KERNEL);
678         struct asd_sas_port  **sas_ports =
679                 kcalloc(ASD_MAX_PHYS, sizeof(*sas_ports), GFP_KERNEL);
680
681         if (!sas_phys || !sas_ports) {
682                 kfree(sas_phys);
683                 kfree(sas_ports);
684                 return -ENOMEM;
685         }
686
687         asd_ha->sas_ha.sas_ha_name = (char *) asd_ha->name;
688         asd_ha->sas_ha.lldd_module = THIS_MODULE;
689         asd_ha->sas_ha.sas_addr = &asd_ha->hw_prof.sas_addr[0];
690
691         for (i = 0; i < ASD_MAX_PHYS; i++) {
692                 sas_phys[i] = &asd_ha->phys[i].sas_phy;
693                 sas_ports[i] = &asd_ha->ports[i];
694         }
695
696         asd_ha->sas_ha.sas_phy = sas_phys;
697         asd_ha->sas_ha.sas_port= sas_ports;
698         asd_ha->sas_ha.num_phys= ASD_MAX_PHYS;
699
700         return sas_register_ha(&asd_ha->sas_ha);
701 }
702
703 static int asd_unregister_sas_ha(struct asd_ha_struct *asd_ha)
704 {
705         int err;
706
707         err = sas_unregister_ha(&asd_ha->sas_ha);
708
709         sas_remove_host(asd_ha->sas_ha.core.shost);
710         scsi_remove_host(asd_ha->sas_ha.core.shost);
711         scsi_host_put(asd_ha->sas_ha.core.shost);
712
713         kfree(asd_ha->sas_ha.sas_phy);
714         kfree(asd_ha->sas_ha.sas_port);
715
716         return err;
717 }
718
719 static int asd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
720 {
721         const struct asd_pcidev_struct *asd_dev;
722         unsigned asd_id = (unsigned) id->driver_data;
723         struct asd_ha_struct *asd_ha;
724         struct Scsi_Host *shost;
725         int err;
726
727         if (asd_id >= ARRAY_SIZE(asd_pcidev_data)) {
728                 asd_printk("wrong driver_data in PCI table\n");
729                 return -ENODEV;
730         }
731
732         if ((err = pci_enable_device(dev))) {
733                 asd_printk("couldn't enable device %s\n", pci_name(dev));
734                 return err;
735         }
736
737         pci_set_master(dev);
738
739         err = -ENOMEM;
740
741         shost = scsi_host_alloc(&aic94xx_sht, sizeof(void *));
742         if (!shost)
743                 goto Err;
744
745         asd_dev = &asd_pcidev_data[asd_id];
746
747         asd_ha = kzalloc(sizeof(*asd_ha), GFP_KERNEL);
748         if (!asd_ha) {
749                 asd_printk("out of memory\n");
750                 goto Err_put;
751         }
752         asd_ha->pcidev = dev;
753         asd_ha->sas_ha.dev = &asd_ha->pcidev->dev;
754         asd_ha->sas_ha.lldd_ha = asd_ha;
755
756         asd_ha->bios_status = FLASH_OK;
757         asd_ha->name = asd_dev->name;
758         asd_printk("found %s, device %s\n", asd_ha->name, pci_name(dev));
759
760         SHOST_TO_SAS_HA(shost) = &asd_ha->sas_ha;
761         asd_ha->sas_ha.core.shost = shost;
762         shost->transportt = aic94xx_transport_template;
763         shost->max_id = ~0;
764         shost->max_lun = ~0;
765         shost->max_cmd_len = 16;
766
767         err = scsi_add_host(shost, &dev->dev);
768         if (err)
769                 goto Err_free;
770
771         err = asd_dev->setup(asd_ha);
772         if (err)
773                 goto Err_remove;
774
775         err = -ENODEV;
776         if (!pci_set_dma_mask(dev, DMA_BIT_MASK(64))
777             && !pci_set_consistent_dma_mask(dev, DMA_BIT_MASK(64)))
778                 ;
779         else if (!pci_set_dma_mask(dev, DMA_BIT_MASK(32))
780                  && !pci_set_consistent_dma_mask(dev, DMA_BIT_MASK(32)))
781                 ;
782         else {
783                 asd_printk("no suitable DMA mask for %s\n", pci_name(dev));
784                 goto Err_remove;
785         }
786
787         pci_set_drvdata(dev, asd_ha);
788
789         err = asd_map_ha(asd_ha);
790         if (err)
791                 goto Err_remove;
792
793         err = asd_create_ha_caches(asd_ha);
794         if (err)
795                 goto Err_unmap;
796
797         err = asd_init_hw(asd_ha);
798         if (err)
799                 goto Err_free_cache;
800
801         asd_printk("device %s: SAS addr %llx, PCBA SN %s, %d phys, %d enabled "
802                    "phys, flash %s, BIOS %s%d\n",
803                    pci_name(dev), SAS_ADDR(asd_ha->hw_prof.sas_addr),
804                    asd_ha->hw_prof.pcba_sn, asd_ha->hw_prof.max_phys,
805                    asd_ha->hw_prof.num_phys,
806                    asd_ha->hw_prof.flash.present ? "present" : "not present",
807                    asd_ha->hw_prof.bios.present ? "build " : "not present",
808                    asd_ha->hw_prof.bios.bld);
809
810         shost->can_queue = asd_ha->seq.can_queue;
811
812         if (use_msi)
813                 pci_enable_msi(asd_ha->pcidev);
814
815         err = request_irq(asd_ha->pcidev->irq, asd_hw_isr, IRQF_SHARED,
816                           ASD_DRIVER_NAME, asd_ha);
817         if (err) {
818                 asd_printk("couldn't get irq %d for %s\n",
819                            asd_ha->pcidev->irq, pci_name(asd_ha->pcidev));
820                 goto Err_irq;
821         }
822         asd_enable_ints(asd_ha);
823
824         err = asd_init_post_escbs(asd_ha);
825         if (err) {
826                 asd_printk("couldn't post escbs for %s\n",
827                            pci_name(asd_ha->pcidev));
828                 goto Err_escbs;
829         }
830         ASD_DPRINTK("escbs posted\n");
831
832         err = asd_create_dev_attrs(asd_ha);
833         if (err)
834                 goto Err_dev_attrs;
835
836         err = asd_register_sas_ha(asd_ha);
837         if (err)
838                 goto Err_reg_sas;
839
840         scsi_scan_host(shost);
841
842         return 0;
843
844 Err_reg_sas:
845         asd_remove_dev_attrs(asd_ha);
846 Err_dev_attrs:
847 Err_escbs:
848         asd_disable_ints(asd_ha);
849         free_irq(dev->irq, asd_ha);
850 Err_irq:
851         if (use_msi)
852                 pci_disable_msi(dev);
853         asd_chip_hardrst(asd_ha);
854 Err_free_cache:
855         asd_destroy_ha_caches(asd_ha);
856 Err_unmap:
857         asd_unmap_ha(asd_ha);
858 Err_remove:
859         scsi_remove_host(shost);
860 Err_free:
861         kfree(asd_ha);
862 Err_put:
863         scsi_host_put(shost);
864 Err:
865         pci_disable_device(dev);
866         return err;
867 }
868
869 static void asd_free_queues(struct asd_ha_struct *asd_ha)
870 {
871         unsigned long flags;
872         LIST_HEAD(pending);
873         struct list_head *n, *pos;
874
875         spin_lock_irqsave(&asd_ha->seq.pend_q_lock, flags);
876         asd_ha->seq.pending = 0;
877         list_splice_init(&asd_ha->seq.pend_q, &pending);
878         spin_unlock_irqrestore(&asd_ha->seq.pend_q_lock, flags);
879
880         if (!list_empty(&pending))
881                 ASD_DPRINTK("Uh-oh! Pending is not empty!\n");
882
883         list_for_each_safe(pos, n, &pending) {
884                 struct asd_ascb *ascb = list_entry(pos, struct asd_ascb, list);
885                 /*
886                  * Delete unexpired ascb timers.  This may happen if we issue
887                  * a CONTROL PHY scb to an adapter and rmmod before the scb
888                  * times out.  Apparently we don't wait for the CONTROL PHY
889                  * to complete, so it doesn't matter if we kill the timer.
890                  */
891                 del_timer_sync(&ascb->timer);
892                 WARN_ON(ascb->scb->header.opcode != CONTROL_PHY);
893
894                 list_del_init(pos);
895                 ASD_DPRINTK("freeing from pending\n");
896                 asd_ascb_free(ascb);
897         }
898 }
899
900 static void asd_turn_off_leds(struct asd_ha_struct *asd_ha)
901 {
902         u8 phy_mask = asd_ha->hw_prof.enabled_phys;
903         u8 i;
904
905         for_each_phy(phy_mask, phy_mask, i) {
906                 asd_turn_led(asd_ha, i, 0);
907                 asd_control_led(asd_ha, i, 0);
908         }
909 }
910
911 static void asd_pci_remove(struct pci_dev *dev)
912 {
913         struct asd_ha_struct *asd_ha = pci_get_drvdata(dev);
914
915         if (!asd_ha)
916                 return;
917
918         asd_unregister_sas_ha(asd_ha);
919
920         asd_disable_ints(asd_ha);
921
922         asd_remove_dev_attrs(asd_ha);
923
924         /* XXX more here as needed */
925
926         free_irq(dev->irq, asd_ha);
927         if (use_msi)
928                 pci_disable_msi(asd_ha->pcidev);
929         asd_turn_off_leds(asd_ha);
930         asd_chip_hardrst(asd_ha);
931         asd_free_queues(asd_ha);
932         asd_destroy_ha_caches(asd_ha);
933         asd_unmap_ha(asd_ha);
934         kfree(asd_ha);
935         pci_disable_device(dev);
936         return;
937 }
938
939 static void asd_scan_start(struct Scsi_Host *shost)
940 {
941         struct asd_ha_struct *asd_ha;
942         int err;
943
944         asd_ha = SHOST_TO_SAS_HA(shost)->lldd_ha;
945         err = asd_enable_phys(asd_ha, asd_ha->hw_prof.enabled_phys);
946         if (err)
947                 asd_printk("Couldn't enable phys, err:%d\n", err);
948 }
949
950 static int asd_scan_finished(struct Scsi_Host *shost, unsigned long time)
951 {
952         /* give the phy enabling interrupt event time to come in (1s
953          * is empirically about all it takes) */
954         if (time < HZ)
955                 return 0;
956         /* Wait for discovery to finish */
957         sas_drain_work(SHOST_TO_SAS_HA(shost));
958         return 1;
959 }
960
961 static ssize_t asd_version_show(struct device_driver *driver, char *buf)
962 {
963         return snprintf(buf, PAGE_SIZE, "%s\n", ASD_DRIVER_VERSION);
964 }
965 static DRIVER_ATTR(version, S_IRUGO, asd_version_show, NULL);
966
967 static int asd_create_driver_attrs(struct device_driver *driver)
968 {
969         return driver_create_file(driver, &driver_attr_version);
970 }
971
972 static void asd_remove_driver_attrs(struct device_driver *driver)
973 {
974         driver_remove_file(driver, &driver_attr_version);
975 }
976
977 static struct sas_domain_function_template aic94xx_transport_functions = {
978         .lldd_dev_found         = asd_dev_found,
979         .lldd_dev_gone          = asd_dev_gone,
980
981         .lldd_execute_task      = asd_execute_task,
982
983         .lldd_abort_task        = asd_abort_task,
984         .lldd_abort_task_set    = asd_abort_task_set,
985         .lldd_clear_aca         = asd_clear_aca,
986         .lldd_clear_task_set    = asd_clear_task_set,
987         .lldd_I_T_nexus_reset   = asd_I_T_nexus_reset,
988         .lldd_lu_reset          = asd_lu_reset,
989         .lldd_query_task        = asd_query_task,
990
991         .lldd_clear_nexus_port  = asd_clear_nexus_port,
992         .lldd_clear_nexus_ha    = asd_clear_nexus_ha,
993
994         .lldd_control_phy       = asd_control_phy,
995
996         .lldd_ata_set_dmamode   = asd_set_dmamode,
997 };
998
999 static const struct pci_device_id aic94xx_pci_table[] = {
1000         {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, 0x410),0, 0, 1},
1001         {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, 0x412),0, 0, 1},
1002         {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, 0x416),0, 0, 1},
1003         {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, 0x41E),0, 0, 1},
1004         {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, 0x41F),0, 0, 1},
1005         {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, 0x430),0, 0, 2},
1006         {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, 0x432),0, 0, 2},
1007         {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, 0x43E),0, 0, 2},
1008         {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, 0x43F),0, 0, 2},
1009         {}
1010 };
1011
1012 MODULE_DEVICE_TABLE(pci, aic94xx_pci_table);
1013
1014 static struct pci_driver aic94xx_pci_driver = {
1015         .name           = ASD_DRIVER_NAME,
1016         .id_table       = aic94xx_pci_table,
1017         .probe          = asd_pci_probe,
1018         .remove         = asd_pci_remove,
1019 };
1020
1021 static int __init aic94xx_init(void)
1022 {
1023         int err;
1024
1025
1026         asd_printk("%s version %s loaded\n", ASD_DRIVER_DESCRIPTION,
1027                    ASD_DRIVER_VERSION);
1028
1029         err = asd_create_global_caches();
1030         if (err)
1031                 return err;
1032
1033         aic94xx_transport_template =
1034                 sas_domain_attach_transport(&aic94xx_transport_functions);
1035         if (!aic94xx_transport_template)
1036                 goto out_destroy_caches;
1037
1038         err = pci_register_driver(&aic94xx_pci_driver);
1039         if (err)
1040                 goto out_release_transport;
1041
1042         err = asd_create_driver_attrs(&aic94xx_pci_driver.driver);
1043         if (err)
1044                 goto out_unregister_pcidrv;
1045
1046         return err;
1047
1048  out_unregister_pcidrv:
1049         pci_unregister_driver(&aic94xx_pci_driver);
1050  out_release_transport:
1051         sas_release_transport(aic94xx_transport_template);
1052  out_destroy_caches:
1053         asd_destroy_global_caches();
1054
1055         return err;
1056 }
1057
1058 static void __exit aic94xx_exit(void)
1059 {
1060         asd_remove_driver_attrs(&aic94xx_pci_driver.driver);
1061         pci_unregister_driver(&aic94xx_pci_driver);
1062         sas_release_transport(aic94xx_transport_template);
1063         asd_release_firmware();
1064         asd_destroy_global_caches();
1065         asd_printk("%s version %s unloaded\n", ASD_DRIVER_DESCRIPTION,
1066                    ASD_DRIVER_VERSION);
1067 }
1068
1069 module_init(aic94xx_init);
1070 module_exit(aic94xx_exit);
1071
1072 MODULE_AUTHOR("Luben Tuikov <luben_tuikov@adaptec.com>");
1073 MODULE_DESCRIPTION(ASD_DRIVER_DESCRIPTION);
1074 MODULE_LICENSE("GPL v2");
1075 MODULE_VERSION(ASD_DRIVER_VERSION);