Merge branch 'linux-2.6' into for-2.6.22
[linux-2.6] / drivers / message / fusion / mptsas.c
1 /*
2  *  linux/drivers/message/fusion/mptsas.c
3  *      For use with LSI Logic PCI chip/adapter(s)
4  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
5  *
6  *  Copyright (c) 1999-2007 LSI Logic Corporation
7  *  (mailto:mpt_linux_developer@lsi.com)
8  *  Copyright (c) 2005-2007 Dell
9  */
10 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
11 /*
12     This program is free software; you can redistribute it and/or modify
13     it under the terms of the GNU General Public License as published by
14     the Free Software Foundation; version 2 of the License.
15
16     This program 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
19     GNU General Public License for more details.
20
21     NO WARRANTY
22     THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
23     CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
24     LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
25     MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
26     solely responsible for determining the appropriateness of using and
27     distributing the Program and assumes all risks associated with its
28     exercise of rights under this Agreement, including but not limited to
29     the risks and costs of program errors, damage to or loss of data,
30     programs or equipment, and unavailability or interruption of operations.
31
32     DISCLAIMER OF LIABILITY
33     NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
34     DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
35     DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
36     ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
37     TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
38     USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
39     HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
40
41     You should have received a copy of the GNU General Public License
42     along with this program; if not, write to the Free Software
43     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
44 */
45 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
46
47 #include <linux/module.h>
48 #include <linux/kernel.h>
49 #include <linux/init.h>
50 #include <linux/errno.h>
51 #include <linux/jiffies.h>
52 #include <linux/workqueue.h>
53 #include <linux/delay.h>        /* for mdelay */
54
55 #include <scsi/scsi.h>
56 #include <scsi/scsi_cmnd.h>
57 #include <scsi/scsi_device.h>
58 #include <scsi/scsi_host.h>
59 #include <scsi/scsi_transport_sas.h>
60 #include <scsi/scsi_dbg.h>
61
62 #include "mptbase.h"
63 #include "mptscsih.h"
64
65
66 #define my_NAME         "Fusion MPT SAS Host driver"
67 #define my_VERSION      MPT_LINUX_VERSION_COMMON
68 #define MYNAM           "mptsas"
69
70 /*
71  * Reserved channel for integrated raid
72  */
73 #define MPTSAS_RAID_CHANNEL     1
74
75 MODULE_AUTHOR(MODULEAUTHOR);
76 MODULE_DESCRIPTION(my_NAME);
77 MODULE_LICENSE("GPL");
78 MODULE_VERSION(my_VERSION);
79
80 static int mpt_pt_clear;
81 module_param(mpt_pt_clear, int, 0);
82 MODULE_PARM_DESC(mpt_pt_clear,
83                 " Clear persistency table: enable=1  "
84                 "(default=MPTSCSIH_PT_CLEAR=0)");
85
86 /* scsi-mid layer global parmeter is max_report_luns, which is 511 */
87 #define MPTSAS_MAX_LUN (16895)
88 static int max_lun = MPTSAS_MAX_LUN;
89 module_param(max_lun, int, 0);
90 MODULE_PARM_DESC(max_lun, " max lun, default=16895 ");
91
92 static int      mptsasDoneCtx = -1;
93 static int      mptsasTaskCtx = -1;
94 static int      mptsasInternalCtx = -1; /* Used only for internal commands */
95 static int      mptsasMgmtCtx = -1;
96
97 static void mptsas_hotplug_work(struct work_struct *work);
98
99 struct mptsas_target_reset_event {
100         struct list_head        list;
101         EVENT_DATA_SAS_DEVICE_STATUS_CHANGE sas_event_data;
102         u8      target_reset_issued;
103 };
104
105 enum mptsas_hotplug_action {
106         MPTSAS_ADD_DEVICE,
107         MPTSAS_DEL_DEVICE,
108         MPTSAS_ADD_RAID,
109         MPTSAS_DEL_RAID,
110         MPTSAS_ADD_INACTIVE_VOLUME,
111         MPTSAS_IGNORE_EVENT,
112 };
113
114 struct mptsas_hotplug_event {
115         struct work_struct      work;
116         MPT_ADAPTER             *ioc;
117         enum mptsas_hotplug_action event_type;
118         u64                     sas_address;
119         u8                      channel;
120         u8                      id;
121         u32                     device_info;
122         u16                     handle;
123         u16                     parent_handle;
124         u8                      phy_id;
125         u8                      phys_disk_num_valid;    /* hrc (hidden raid component) */
126         u8                      phys_disk_num;          /* hrc - unique index*/
127         u8                      hidden_raid_component;  /* hrc - don't expose*/
128 };
129
130 struct mptsas_discovery_event {
131         struct work_struct      work;
132         MPT_ADAPTER             *ioc;
133 };
134
135 /*
136  * SAS topology structures
137  *
138  * The MPT Fusion firmware interface spreads information about the
139  * SAS topology over many manufacture pages, thus we need some data
140  * structure to collect it and process it for the SAS transport class.
141  */
142
143 struct mptsas_devinfo {
144         u16     handle;         /* unique id to address this device */
145         u16     handle_parent;  /* unique id to address parent device */
146         u16     handle_enclosure; /* enclosure identifier of the enclosure */
147         u16     slot;           /* physical slot in enclosure */
148         u8      phy_id;         /* phy number of parent device */
149         u8      port_id;        /* sas physical port this device
150                                    is assoc'd with */
151         u8      id;             /* logical target id of this device */
152         u32     phys_disk_num;  /* phys disk id, for csmi-ioctls */
153         u8      channel;        /* logical bus number of this device */
154         u64     sas_address;    /* WWN of this device,
155                                    SATA is assigned by HBA,expander */
156         u32     device_info;    /* bitfield detailed info about this device */
157 };
158
159 /*
160  * Specific details on ports, wide/narrow
161  */
162 struct mptsas_portinfo_details{
163         u16     num_phys;       /* number of phys belong to this port */
164         u64     phy_bitmask;    /* TODO, extend support for 255 phys */
165         struct sas_rphy *rphy;  /* transport layer rphy object */
166         struct sas_port *port;  /* transport layer port object */
167         struct scsi_target *starget;
168         struct mptsas_portinfo *port_info;
169 };
170
171 struct mptsas_phyinfo {
172         u16     handle;                 /* unique id to address this */
173         u8      phy_id;                 /* phy index */
174         u8      port_id;                /* firmware port identifier */
175         u8      negotiated_link_rate;   /* nego'd link rate for this phy */
176         u8      hw_link_rate;           /* hardware max/min phys link rate */
177         u8      programmed_link_rate;   /* programmed max/min phy link rate */
178         u8      sas_port_add_phy;       /* flag to request sas_port_add_phy*/
179         struct mptsas_devinfo identify; /* point to phy device info */
180         struct mptsas_devinfo attached; /* point to attached device info */
181         struct sas_phy *phy;            /* transport layer phy object */
182         struct mptsas_portinfo *portinfo;
183         struct mptsas_portinfo_details * port_details;
184 };
185
186 struct mptsas_portinfo {
187         struct list_head list;
188         u16             num_phys;       /* number of phys */
189         struct mptsas_phyinfo *phy_info;
190 };
191
192 struct mptsas_enclosure {
193         u64     enclosure_logical_id;   /* The WWN for the enclosure */
194         u16     enclosure_handle;       /* unique id to address this */
195         u16     flags;                  /* details enclosure management */
196         u16     num_slot;               /* num slots */
197         u16     start_slot;             /* first slot */
198         u8      start_id;               /* starting logical target id */
199         u8      start_channel;          /* starting logical channel id */
200         u8      sep_id;                 /* SEP device logical target id */
201         u8      sep_channel;            /* SEP channel logical channel id */
202 };
203
204 #ifdef MPT_DEBUG_SAS
205 static void mptsas_print_phy_data(MPI_SAS_IO_UNIT0_PHY_DATA *phy_data)
206 {
207         printk("---- IO UNIT PAGE 0 ------------\n");
208         printk("Handle=0x%X\n",
209                 le16_to_cpu(phy_data->AttachedDeviceHandle));
210         printk("Controller Handle=0x%X\n",
211                 le16_to_cpu(phy_data->ControllerDevHandle));
212         printk("Port=0x%X\n", phy_data->Port);
213         printk("Port Flags=0x%X\n", phy_data->PortFlags);
214         printk("PHY Flags=0x%X\n", phy_data->PhyFlags);
215         printk("Negotiated Link Rate=0x%X\n", phy_data->NegotiatedLinkRate);
216         printk("Controller PHY Device Info=0x%X\n",
217                 le32_to_cpu(phy_data->ControllerPhyDeviceInfo));
218         printk("DiscoveryStatus=0x%X\n",
219                 le32_to_cpu(phy_data->DiscoveryStatus));
220         printk("\n");
221 }
222
223 static void mptsas_print_phy_pg0(SasPhyPage0_t *pg0)
224 {
225         __le64 sas_address;
226
227         memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
228
229         printk("---- SAS PHY PAGE 0 ------------\n");
230         printk("Attached Device Handle=0x%X\n",
231                         le16_to_cpu(pg0->AttachedDevHandle));
232         printk("SAS Address=0x%llX\n",
233                         (unsigned long long)le64_to_cpu(sas_address));
234         printk("Attached PHY Identifier=0x%X\n", pg0->AttachedPhyIdentifier);
235         printk("Attached Device Info=0x%X\n",
236                         le32_to_cpu(pg0->AttachedDeviceInfo));
237         printk("Programmed Link Rate=0x%X\n", pg0->ProgrammedLinkRate);
238         printk("Change Count=0x%X\n", pg0->ChangeCount);
239         printk("PHY Info=0x%X\n", le32_to_cpu(pg0->PhyInfo));
240         printk("\n");
241 }
242
243 static void mptsas_print_phy_pg1(SasPhyPage1_t *pg1)
244 {
245         printk("---- SAS PHY PAGE 1 ------------\n");
246         printk("Invalid Dword Count=0x%x\n", pg1->InvalidDwordCount);
247         printk("Running Disparity Error Count=0x%x\n",
248                         pg1->RunningDisparityErrorCount);
249         printk("Loss Dword Synch Count=0x%x\n", pg1->LossDwordSynchCount);
250         printk("PHY Reset Problem Count=0x%x\n", pg1->PhyResetProblemCount);
251         printk("\n");
252 }
253
254 static void mptsas_print_device_pg0(SasDevicePage0_t *pg0)
255 {
256         __le64 sas_address;
257
258         memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
259
260         printk("---- SAS DEVICE PAGE 0 ---------\n");
261         printk("Handle=0x%X\n" ,le16_to_cpu(pg0->DevHandle));
262         printk("Parent Handle=0x%X\n" ,le16_to_cpu(pg0->ParentDevHandle));
263         printk("Enclosure Handle=0x%X\n", le16_to_cpu(pg0->EnclosureHandle));
264         printk("Slot=0x%X\n", le16_to_cpu(pg0->Slot));
265         printk("SAS Address=0x%llX\n", (unsigned long long)
266             le64_to_cpu(sas_address));
267         printk("Target ID=0x%X\n", pg0->TargetID);
268         printk("Bus=0x%X\n", pg0->Bus);
269         /* The PhyNum field specifies the PHY number of the parent
270          * device this device is linked to
271          */
272         printk("Parent Phy Num=0x%X\n", pg0->PhyNum);
273         printk("Access Status=0x%X\n", le16_to_cpu(pg0->AccessStatus));
274         printk("Device Info=0x%X\n", le32_to_cpu(pg0->DeviceInfo));
275         printk("Flags=0x%X\n", le16_to_cpu(pg0->Flags));
276         printk("Physical Port=0x%X\n", pg0->PhysicalPort);
277         printk("\n");
278 }
279
280 static void mptsas_print_expander_pg1(SasExpanderPage1_t *pg1)
281 {
282         printk("---- SAS EXPANDER PAGE 1 ------------\n");
283
284         printk("Physical Port=0x%X\n", pg1->PhysicalPort);
285         printk("PHY Identifier=0x%X\n", pg1->PhyIdentifier);
286         printk("Negotiated Link Rate=0x%X\n", pg1->NegotiatedLinkRate);
287         printk("Programmed Link Rate=0x%X\n", pg1->ProgrammedLinkRate);
288         printk("Hardware Link Rate=0x%X\n", pg1->HwLinkRate);
289         printk("Owner Device Handle=0x%X\n",
290                         le16_to_cpu(pg1->OwnerDevHandle));
291         printk("Attached Device Handle=0x%X\n",
292                         le16_to_cpu(pg1->AttachedDevHandle));
293 }
294 #else
295 #define mptsas_print_phy_data(phy_data)         do { } while (0)
296 #define mptsas_print_phy_pg0(pg0)               do { } while (0)
297 #define mptsas_print_phy_pg1(pg1)               do { } while (0)
298 #define mptsas_print_device_pg0(pg0)            do { } while (0)
299 #define mptsas_print_expander_pg1(pg1)          do { } while (0)
300 #endif
301
302 static inline MPT_ADAPTER *phy_to_ioc(struct sas_phy *phy)
303 {
304         struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
305         return ((MPT_SCSI_HOST *)shost->hostdata)->ioc;
306 }
307
308 static inline MPT_ADAPTER *rphy_to_ioc(struct sas_rphy *rphy)
309 {
310         struct Scsi_Host *shost = dev_to_shost(rphy->dev.parent->parent);
311         return ((MPT_SCSI_HOST *)shost->hostdata)->ioc;
312 }
313
314 /*
315  * mptsas_find_portinfo_by_handle
316  *
317  * This function should be called with the sas_topology_mutex already held
318  */
319 static struct mptsas_portinfo *
320 mptsas_find_portinfo_by_handle(MPT_ADAPTER *ioc, u16 handle)
321 {
322         struct mptsas_portinfo *port_info, *rc=NULL;
323         int i;
324
325         list_for_each_entry(port_info, &ioc->sas_topology, list)
326                 for (i = 0; i < port_info->num_phys; i++)
327                         if (port_info->phy_info[i].identify.handle == handle) {
328                                 rc = port_info;
329                                 goto out;
330                         }
331  out:
332         return rc;
333 }
334
335 /*
336  * Returns true if there is a scsi end device
337  */
338 static inline int
339 mptsas_is_end_device(struct mptsas_devinfo * attached)
340 {
341         if ((attached->sas_address) &&
342             (attached->device_info &
343             MPI_SAS_DEVICE_INFO_END_DEVICE) &&
344             ((attached->device_info &
345             MPI_SAS_DEVICE_INFO_SSP_TARGET) |
346             (attached->device_info &
347             MPI_SAS_DEVICE_INFO_STP_TARGET) |
348             (attached->device_info &
349             MPI_SAS_DEVICE_INFO_SATA_DEVICE)))
350                 return 1;
351         else
352                 return 0;
353 }
354
355 /* no mutex */
356 static void
357 mptsas_port_delete(struct mptsas_portinfo_details * port_details)
358 {
359         struct mptsas_portinfo *port_info;
360         struct mptsas_phyinfo *phy_info;
361         u8      i;
362
363         if (!port_details)
364                 return;
365
366         port_info = port_details->port_info;
367         phy_info = port_info->phy_info;
368
369         dsaswideprintk((KERN_DEBUG "%s: [%p]: num_phys=%02d "
370             "bitmask=0x%016llX\n", __FUNCTION__, port_details,
371             port_details->num_phys, (unsigned long long)
372             port_details->phy_bitmask));
373
374         for (i = 0; i < port_info->num_phys; i++, phy_info++) {
375                 if(phy_info->port_details != port_details)
376                         continue;
377                 memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo));
378                 phy_info->port_details = NULL;
379         }
380         kfree(port_details);
381 }
382
383 static inline struct sas_rphy *
384 mptsas_get_rphy(struct mptsas_phyinfo *phy_info)
385 {
386         if (phy_info->port_details)
387                 return phy_info->port_details->rphy;
388         else
389                 return NULL;
390 }
391
392 static inline void
393 mptsas_set_rphy(struct mptsas_phyinfo *phy_info, struct sas_rphy *rphy)
394 {
395         if (phy_info->port_details) {
396                 phy_info->port_details->rphy = rphy;
397                 dsaswideprintk((KERN_DEBUG "sas_rphy_add: rphy=%p\n", rphy));
398         }
399
400 #ifdef MPT_DEBUG_SAS_WIDE
401         if (rphy) {
402                 dev_printk(KERN_DEBUG, &rphy->dev, "add:");
403                 printk("rphy=%p release=%p\n",
404                         rphy, rphy->dev.release);
405         }
406 #endif
407 }
408
409 static inline struct sas_port *
410 mptsas_get_port(struct mptsas_phyinfo *phy_info)
411 {
412         if (phy_info->port_details)
413                 return phy_info->port_details->port;
414         else
415                 return NULL;
416 }
417
418 static inline void
419 mptsas_set_port(struct mptsas_phyinfo *phy_info, struct sas_port *port)
420 {
421         if (phy_info->port_details)
422                 phy_info->port_details->port = port;
423
424 #ifdef MPT_DEBUG_SAS_WIDE
425         if (port) {
426                 dev_printk(KERN_DEBUG, &port->dev, "add: ");
427                 printk("port=%p release=%p\n",
428                         port, port->dev.release);
429         }
430 #endif
431 }
432
433 static inline struct scsi_target *
434 mptsas_get_starget(struct mptsas_phyinfo *phy_info)
435 {
436         if (phy_info->port_details)
437                 return phy_info->port_details->starget;
438         else
439                 return NULL;
440 }
441
442 static inline void
443 mptsas_set_starget(struct mptsas_phyinfo *phy_info, struct scsi_target *
444 starget)
445 {
446         if (phy_info->port_details)
447                 phy_info->port_details->starget = starget;
448 }
449
450
451 /*
452  * mptsas_setup_wide_ports
453  *
454  * Updates for new and existing narrow/wide port configuration
455  * in the sas_topology
456  */
457 static void
458 mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
459 {
460         struct mptsas_portinfo_details * port_details;
461         struct mptsas_phyinfo *phy_info, *phy_info_cmp;
462         u64     sas_address;
463         int     i, j;
464
465         mutex_lock(&ioc->sas_topology_mutex);
466
467         phy_info = port_info->phy_info;
468         for (i = 0 ; i < port_info->num_phys ; i++, phy_info++) {
469                 if (phy_info->attached.handle)
470                         continue;
471                 port_details = phy_info->port_details;
472                 if (!port_details)
473                         continue;
474                 if (port_details->num_phys < 2)
475                         continue;
476                 /*
477                  * Removing a phy from a port, letting the last
478                  * phy be removed by firmware events.
479                  */
480                 dsaswideprintk((KERN_DEBUG
481                         "%s: [%p]: deleting phy = %d\n",
482                         __FUNCTION__, port_details, i));
483                 port_details->num_phys--;
484                 port_details->phy_bitmask &= ~ (1 << phy_info->phy_id);
485                 memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo));
486                 sas_port_delete_phy(port_details->port, phy_info->phy);
487                 phy_info->port_details = NULL;
488         }
489
490         /*
491          * Populate and refresh the tree
492          */
493         phy_info = port_info->phy_info;
494         for (i = 0 ; i < port_info->num_phys ; i++, phy_info++) {
495                 sas_address = phy_info->attached.sas_address;
496                 dsaswideprintk((KERN_DEBUG "phy_id=%d sas_address=0x%018llX\n",
497                     i, (unsigned long long)sas_address));
498                 if (!sas_address)
499                         continue;
500                 port_details = phy_info->port_details;
501                 /*
502                  * Forming a port
503                  */
504                 if (!port_details) {
505                         port_details = kzalloc(sizeof(*port_details),
506                                 GFP_KERNEL);
507                         if (!port_details)
508                                 goto out;
509                         port_details->num_phys = 1;
510                         port_details->port_info = port_info;
511                         if (phy_info->phy_id < 64 )
512                                 port_details->phy_bitmask |=
513                                     (1 << phy_info->phy_id);
514                         phy_info->sas_port_add_phy=1;
515                         dsaswideprintk((KERN_DEBUG "\t\tForming port\n\t\t"
516                             "phy_id=%d sas_address=0x%018llX\n",
517                             i, (unsigned long long)sas_address));
518                         phy_info->port_details = port_details;
519                 }
520
521                 if (i == port_info->num_phys - 1)
522                         continue;
523                 phy_info_cmp = &port_info->phy_info[i + 1];
524                 for (j = i + 1 ; j < port_info->num_phys ; j++,
525                     phy_info_cmp++) {
526                         if (!phy_info_cmp->attached.sas_address)
527                                 continue;
528                         if (sas_address != phy_info_cmp->attached.sas_address)
529                                 continue;
530                         if (phy_info_cmp->port_details == port_details )
531                                 continue;
532                         dsaswideprintk((KERN_DEBUG
533                             "\t\tphy_id=%d sas_address=0x%018llX\n",
534                             j, (unsigned long long)
535                             phy_info_cmp->attached.sas_address));
536                         if (phy_info_cmp->port_details) {
537                                 port_details->rphy =
538                                     mptsas_get_rphy(phy_info_cmp);
539                                 port_details->port =
540                                     mptsas_get_port(phy_info_cmp);
541                                 port_details->starget =
542                                     mptsas_get_starget(phy_info_cmp);
543                                 port_details->num_phys =
544                                         phy_info_cmp->port_details->num_phys;
545                                 if (!phy_info_cmp->port_details->num_phys)
546                                         kfree(phy_info_cmp->port_details);
547                         } else
548                                 phy_info_cmp->sas_port_add_phy=1;
549                         /*
550                          * Adding a phy to a port
551                          */
552                         phy_info_cmp->port_details = port_details;
553                         if (phy_info_cmp->phy_id < 64 )
554                                 port_details->phy_bitmask |=
555                                 (1 << phy_info_cmp->phy_id);
556                         port_details->num_phys++;
557                 }
558         }
559
560  out:
561
562 #ifdef MPT_DEBUG_SAS_WIDE
563         for (i = 0; i < port_info->num_phys; i++) {
564                 port_details = port_info->phy_info[i].port_details;
565                 if (!port_details)
566                         continue;
567                 dsaswideprintk((KERN_DEBUG
568                     "%s: [%p]: phy_id=%02d num_phys=%02d "
569                     "bitmask=0x%016llX\n", __FUNCTION__,
570                     port_details, i, port_details->num_phys,
571                     (unsigned long long)port_details->phy_bitmask));
572                 dsaswideprintk((KERN_DEBUG"\t\tport = %p rphy=%p\n",
573                         port_details->port, port_details->rphy));
574         }
575         dsaswideprintk((KERN_DEBUG"\n"));
576 #endif
577         mutex_unlock(&ioc->sas_topology_mutex);
578 }
579
580 /**
581  * csmisas_find_vtarget
582  *
583  * @ioc
584  * @volume_id
585  * @volume_bus
586  *
587  **/
588 static VirtTarget *
589 mptsas_find_vtarget(MPT_ADAPTER *ioc, u8 channel, u8 id)
590 {
591         struct scsi_device              *sdev;
592         VirtDevice                      *vdev;
593         VirtTarget                      *vtarget = NULL;
594
595         shost_for_each_device(sdev, ioc->sh) {
596                 if ((vdev = sdev->hostdata) == NULL)
597                         continue;
598                 if (vdev->vtarget->id == id &&
599                     vdev->vtarget->channel == channel)
600                         vtarget = vdev->vtarget;
601         }
602         return vtarget;
603 }
604
605 /**
606  * mptsas_target_reset
607  *
608  * Issues TARGET_RESET to end device using handshaking method
609  *
610  * @ioc
611  * @channel
612  * @id
613  *
614  * Returns (1) success
615  *         (0) failure
616  *
617  **/
618 static int
619 mptsas_target_reset(MPT_ADAPTER *ioc, u8 channel, u8 id)
620 {
621         MPT_FRAME_HDR   *mf;
622         SCSITaskMgmt_t  *pScsiTm;
623
624         if ((mf = mpt_get_msg_frame(ioc->TaskCtx, ioc)) == NULL) {
625                 dfailprintk((MYIOC_s_WARN_FMT "%s, no msg frames @%d!!\n",
626                     ioc->name,__FUNCTION__, __LINE__));
627                 return 0;
628         }
629
630         /* Format the Request
631          */
632         pScsiTm = (SCSITaskMgmt_t *) mf;
633         memset (pScsiTm, 0, sizeof(SCSITaskMgmt_t));
634         pScsiTm->TargetID = id;
635         pScsiTm->Bus = channel;
636         pScsiTm->Function = MPI_FUNCTION_SCSI_TASK_MGMT;
637         pScsiTm->TaskType = MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET;
638         pScsiTm->MsgFlags = MPI_SCSITASKMGMT_MSGFLAGS_LIPRESET_RESET_OPTION;
639
640         DBG_DUMP_TM_REQUEST_FRAME(mf);
641
642         if (mpt_send_handshake_request(ioc->TaskCtx, ioc,
643             sizeof(SCSITaskMgmt_t), (u32 *)mf, NO_SLEEP)) {
644                 mpt_free_msg_frame(ioc, mf);
645                 dfailprintk((MYIOC_s_WARN_FMT "%s, tm handshake failed @%d!!\n",
646                     ioc->name,__FUNCTION__, __LINE__));
647                 return 0;
648         }
649
650         return 1;
651 }
652
653 /**
654  * mptsas_target_reset_queue
655  *
656  * Receive request for TARGET_RESET after recieving an firmware
657  * event NOT_RESPONDING_EVENT, then put command in link list
658  * and queue if task_queue already in use.
659  *
660  * @ioc
661  * @sas_event_data
662  *
663  **/
664 static void
665 mptsas_target_reset_queue(MPT_ADAPTER *ioc,
666     EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data)
667 {
668         MPT_SCSI_HOST   *hd = (MPT_SCSI_HOST *)ioc->sh->hostdata;
669         VirtTarget *vtarget = NULL;
670         struct mptsas_target_reset_event *target_reset_list;
671         u8              id, channel;
672
673         id = sas_event_data->TargetID;
674         channel = sas_event_data->Bus;
675
676         if (!(vtarget = mptsas_find_vtarget(ioc, channel, id)))
677                 return;
678
679         vtarget->deleted = 1; /* block IO */
680
681         target_reset_list = kzalloc(sizeof(*target_reset_list),
682             GFP_ATOMIC);
683         if (!target_reset_list) {
684                 dfailprintk((MYIOC_s_WARN_FMT "%s, failed to allocate mem @%d..!!\n",
685                     ioc->name,__FUNCTION__, __LINE__));
686                 return;
687         }
688
689         memcpy(&target_reset_list->sas_event_data, sas_event_data,
690                 sizeof(*sas_event_data));
691         list_add_tail(&target_reset_list->list, &hd->target_reset_list);
692
693         if (hd->resetPending)
694                 return;
695
696         if (mptsas_target_reset(ioc, channel, id)) {
697                 target_reset_list->target_reset_issued = 1;
698                 hd->resetPending = 1;
699         }
700 }
701
702 /**
703  * mptsas_dev_reset_complete
704  *
705  * Completion for TARGET_RESET after NOT_RESPONDING_EVENT,
706  * enable work queue to finish off removing device from upper layers.
707  * then send next TARGET_RESET in the queue.
708  *
709  * @ioc
710  *
711  **/
712 static void
713 mptsas_dev_reset_complete(MPT_ADAPTER *ioc)
714 {
715         MPT_SCSI_HOST   *hd = (MPT_SCSI_HOST *)ioc->sh->hostdata;
716         struct list_head *head = &hd->target_reset_list;
717         struct mptsas_target_reset_event *target_reset_list;
718         struct mptsas_hotplug_event *ev;
719         EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data;
720         u8              id, channel;
721         __le64          sas_address;
722
723         if (list_empty(head))
724                 return;
725
726         target_reset_list = list_entry(head->next, struct mptsas_target_reset_event, list);
727
728         sas_event_data = &target_reset_list->sas_event_data;
729         id = sas_event_data->TargetID;
730         channel = sas_event_data->Bus;
731         hd->resetPending = 0;
732
733         /*
734          * retry target reset
735          */
736         if (!target_reset_list->target_reset_issued) {
737                 if (mptsas_target_reset(ioc, channel, id)) {
738                         target_reset_list->target_reset_issued = 1;
739                         hd->resetPending = 1;
740                 }
741                 return;
742         }
743
744         /*
745          * enable work queue to remove device from upper layers
746          */
747         list_del(&target_reset_list->list);
748
749         ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
750         if (!ev) {
751                 dfailprintk((MYIOC_s_WARN_FMT "%s, failed to allocate mem @%d..!!\n",
752                     ioc->name,__FUNCTION__, __LINE__));
753                 return;
754         }
755
756         INIT_WORK(&ev->work, mptsas_hotplug_work);
757         ev->ioc = ioc;
758         ev->handle = le16_to_cpu(sas_event_data->DevHandle);
759         ev->parent_handle =
760             le16_to_cpu(sas_event_data->ParentDevHandle);
761         ev->channel = channel;
762         ev->id =id;
763         ev->phy_id = sas_event_data->PhyNum;
764         memcpy(&sas_address, &sas_event_data->SASAddress,
765             sizeof(__le64));
766         ev->sas_address = le64_to_cpu(sas_address);
767         ev->device_info = le32_to_cpu(sas_event_data->DeviceInfo);
768         ev->event_type = MPTSAS_DEL_DEVICE;
769         schedule_work(&ev->work);
770         kfree(target_reset_list);
771
772         /*
773          * issue target reset to next device in the queue
774          */
775
776         head = &hd->target_reset_list;
777         if (list_empty(head))
778                 return;
779
780         target_reset_list = list_entry(head->next, struct mptsas_target_reset_event,
781             list);
782
783         sas_event_data = &target_reset_list->sas_event_data;
784         id = sas_event_data->TargetID;
785         channel = sas_event_data->Bus;
786
787         if (mptsas_target_reset(ioc, channel, id)) {
788                 target_reset_list->target_reset_issued = 1;
789                 hd->resetPending = 1;
790         }
791 }
792
793 /**
794  * mptsas_taskmgmt_complete
795  *
796  * @ioc
797  * @mf
798  * @mr
799  *
800  **/
801 static int
802 mptsas_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
803 {
804         mptsas_dev_reset_complete(ioc);
805         return mptscsih_taskmgmt_complete(ioc, mf, mr);
806 }
807
808 /**
809  * mptscsih_ioc_reset
810  *
811  * @ioc
812  * @reset_phase
813  *
814  **/
815 static int
816 mptsas_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
817 {
818         MPT_SCSI_HOST   *hd;
819         struct mptsas_target_reset_event *target_reset_list, *n;
820         int rc;
821
822         rc = mptscsih_ioc_reset(ioc, reset_phase);
823
824         if (ioc->bus_type != SAS)
825                 goto out;
826
827         if (reset_phase != MPT_IOC_POST_RESET)
828                 goto out;
829
830         if (!ioc->sh || !ioc->sh->hostdata)
831                 goto out;
832         hd = (MPT_SCSI_HOST *)ioc->sh->hostdata;
833         if (!hd->ioc)
834                 goto out;
835
836         if (list_empty(&hd->target_reset_list))
837                 goto out;
838
839         /* flush the target_reset_list */
840         list_for_each_entry_safe(target_reset_list, n,
841             &hd->target_reset_list, list) {
842                 list_del(&target_reset_list->list);
843                 kfree(target_reset_list);
844         }
845
846  out:
847         return rc;
848 }
849
850 static int
851 mptsas_sas_enclosure_pg0(MPT_ADAPTER *ioc, struct mptsas_enclosure *enclosure,
852                 u32 form, u32 form_specific)
853 {
854         ConfigExtendedPageHeader_t hdr;
855         CONFIGPARMS cfg;
856         SasEnclosurePage0_t *buffer;
857         dma_addr_t dma_handle;
858         int error;
859         __le64 le_identifier;
860
861         memset(&hdr, 0, sizeof(hdr));
862         hdr.PageVersion = MPI_SASENCLOSURE0_PAGEVERSION;
863         hdr.PageNumber = 0;
864         hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
865         hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_ENCLOSURE;
866
867         cfg.cfghdr.ehdr = &hdr;
868         cfg.physAddr = -1;
869         cfg.pageAddr = form + form_specific;
870         cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
871         cfg.dir = 0;    /* read */
872         cfg.timeout = 10;
873
874         error = mpt_config(ioc, &cfg);
875         if (error)
876                 goto out;
877         if (!hdr.ExtPageLength) {
878                 error = -ENXIO;
879                 goto out;
880         }
881
882         buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
883                         &dma_handle);
884         if (!buffer) {
885                 error = -ENOMEM;
886                 goto out;
887         }
888
889         cfg.physAddr = dma_handle;
890         cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
891
892         error = mpt_config(ioc, &cfg);
893         if (error)
894                 goto out_free_consistent;
895
896         /* save config data */
897         memcpy(&le_identifier, &buffer->EnclosureLogicalID, sizeof(__le64));
898         enclosure->enclosure_logical_id = le64_to_cpu(le_identifier);
899         enclosure->enclosure_handle = le16_to_cpu(buffer->EnclosureHandle);
900         enclosure->flags = le16_to_cpu(buffer->Flags);
901         enclosure->num_slot = le16_to_cpu(buffer->NumSlots);
902         enclosure->start_slot = le16_to_cpu(buffer->StartSlot);
903         enclosure->start_id = buffer->StartTargetID;
904         enclosure->start_channel = buffer->StartBus;
905         enclosure->sep_id = buffer->SEPTargetID;
906         enclosure->sep_channel = buffer->SEPBus;
907
908  out_free_consistent:
909         pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
910                             buffer, dma_handle);
911  out:
912         return error;
913 }
914
915 static int
916 mptsas_slave_configure(struct scsi_device *sdev)
917 {
918
919         if (sdev->channel == MPTSAS_RAID_CHANNEL)
920                 goto out;
921
922         sas_read_port_mode_page(sdev);
923
924  out:
925         return mptscsih_slave_configure(sdev);
926 }
927
928 static int
929 mptsas_target_alloc(struct scsi_target *starget)
930 {
931         struct Scsi_Host *host = dev_to_shost(&starget->dev);
932         MPT_SCSI_HOST           *hd = (MPT_SCSI_HOST *)host->hostdata;
933         VirtTarget              *vtarget;
934         u8                      id, channel;
935         struct sas_rphy         *rphy;
936         struct mptsas_portinfo  *p;
937         int                      i;
938
939         vtarget = kzalloc(sizeof(VirtTarget), GFP_KERNEL);
940         if (!vtarget)
941                 return -ENOMEM;
942
943         vtarget->starget = starget;
944         vtarget->ioc_id = hd->ioc->id;
945         vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;
946         id = starget->id;
947         channel = 0;
948
949         /*
950          * RAID volumes placed beyond the last expected port.
951          */
952         if (starget->channel == MPTSAS_RAID_CHANNEL) {
953                 for (i=0; i < hd->ioc->raid_data.pIocPg2->NumActiveVolumes; i++)
954                         if (id == hd->ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID)
955                                 channel = hd->ioc->raid_data.pIocPg2->RaidVolume[i].VolumeBus;
956                 goto out;
957         }
958
959         rphy = dev_to_rphy(starget->dev.parent);
960         mutex_lock(&hd->ioc->sas_topology_mutex);
961         list_for_each_entry(p, &hd->ioc->sas_topology, list) {
962                 for (i = 0; i < p->num_phys; i++) {
963                         if (p->phy_info[i].attached.sas_address !=
964                                         rphy->identify.sas_address)
965                                 continue;
966                         id = p->phy_info[i].attached.id;
967                         channel = p->phy_info[i].attached.channel;
968                         mptsas_set_starget(&p->phy_info[i], starget);
969
970                         /*
971                          * Exposing hidden raid components
972                          */
973                         if (mptscsih_is_phys_disk(hd->ioc, channel, id)) {
974                                 id = mptscsih_raid_id_to_num(hd->ioc,
975                                                 channel, id);
976                                 vtarget->tflags |=
977                                     MPT_TARGET_FLAGS_RAID_COMPONENT;
978                                 p->phy_info[i].attached.phys_disk_num = id;
979                         }
980                         mutex_unlock(&hd->ioc->sas_topology_mutex);
981                         goto out;
982                 }
983         }
984         mutex_unlock(&hd->ioc->sas_topology_mutex);
985
986         kfree(vtarget);
987         return -ENXIO;
988
989  out:
990         vtarget->id = id;
991         vtarget->channel = channel;
992         starget->hostdata = vtarget;
993         return 0;
994 }
995
996 static void
997 mptsas_target_destroy(struct scsi_target *starget)
998 {
999         struct Scsi_Host *host = dev_to_shost(&starget->dev);
1000         MPT_SCSI_HOST           *hd = (MPT_SCSI_HOST *)host->hostdata;
1001         struct sas_rphy         *rphy;
1002         struct mptsas_portinfo  *p;
1003         int                      i;
1004
1005         if (!starget->hostdata)
1006                 return;
1007
1008         if (starget->channel == MPTSAS_RAID_CHANNEL)
1009                 goto out;
1010
1011         rphy = dev_to_rphy(starget->dev.parent);
1012         list_for_each_entry(p, &hd->ioc->sas_topology, list) {
1013                 for (i = 0; i < p->num_phys; i++) {
1014                         if (p->phy_info[i].attached.sas_address !=
1015                                         rphy->identify.sas_address)
1016                                 continue;
1017                         mptsas_set_starget(&p->phy_info[i], NULL);
1018                         goto out;
1019                 }
1020         }
1021
1022  out:
1023         kfree(starget->hostdata);
1024         starget->hostdata = NULL;
1025 }
1026
1027
1028 static int
1029 mptsas_slave_alloc(struct scsi_device *sdev)
1030 {
1031         struct Scsi_Host        *host = sdev->host;
1032         MPT_SCSI_HOST           *hd = (MPT_SCSI_HOST *)host->hostdata;
1033         struct sas_rphy         *rphy;
1034         struct mptsas_portinfo  *p;
1035         VirtDevice              *vdev;
1036         struct scsi_target      *starget;
1037         int                     i;
1038
1039         vdev = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
1040         if (!vdev) {
1041                 printk(MYIOC_s_ERR_FMT "slave_alloc kzalloc(%zd) FAILED!\n",
1042                                 hd->ioc->name, sizeof(VirtDevice));
1043                 return -ENOMEM;
1044         }
1045         starget = scsi_target(sdev);
1046         vdev->vtarget = starget->hostdata;
1047
1048         if (sdev->channel == MPTSAS_RAID_CHANNEL)
1049                 goto out;
1050
1051         rphy = dev_to_rphy(sdev->sdev_target->dev.parent);
1052         mutex_lock(&hd->ioc->sas_topology_mutex);
1053         list_for_each_entry(p, &hd->ioc->sas_topology, list) {
1054                 for (i = 0; i < p->num_phys; i++) {
1055                         if (p->phy_info[i].attached.sas_address !=
1056                                         rphy->identify.sas_address)
1057                                 continue;
1058                         vdev->lun = sdev->lun;
1059                         /*
1060                          * Exposing hidden raid components
1061                          */
1062                         if (mptscsih_is_phys_disk(hd->ioc,
1063                             p->phy_info[i].attached.channel,
1064                             p->phy_info[i].attached.id))
1065                                 sdev->no_uld_attach = 1;
1066                         mutex_unlock(&hd->ioc->sas_topology_mutex);
1067                         goto out;
1068                 }
1069         }
1070         mutex_unlock(&hd->ioc->sas_topology_mutex);
1071
1072         kfree(vdev);
1073         return -ENXIO;
1074
1075  out:
1076         vdev->vtarget->num_luns++;
1077         sdev->hostdata = vdev;
1078         return 0;
1079 }
1080
1081 static int
1082 mptsas_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
1083 {
1084         VirtDevice      *vdev = SCpnt->device->hostdata;
1085
1086         if (!vdev || !vdev->vtarget || vdev->vtarget->deleted) {
1087                 SCpnt->result = DID_NO_CONNECT << 16;
1088                 done(SCpnt);
1089                 return 0;
1090         }
1091
1092 //      scsi_print_command(SCpnt);
1093
1094         return mptscsih_qcmd(SCpnt,done);
1095 }
1096
1097
1098 static struct scsi_host_template mptsas_driver_template = {
1099         .module                         = THIS_MODULE,
1100         .proc_name                      = "mptsas",
1101         .proc_info                      = mptscsih_proc_info,
1102         .name                           = "MPT SPI Host",
1103         .info                           = mptscsih_info,
1104         .queuecommand                   = mptsas_qcmd,
1105         .target_alloc                   = mptsas_target_alloc,
1106         .slave_alloc                    = mptsas_slave_alloc,
1107         .slave_configure                = mptsas_slave_configure,
1108         .target_destroy                 = mptsas_target_destroy,
1109         .slave_destroy                  = mptscsih_slave_destroy,
1110         .change_queue_depth             = mptscsih_change_queue_depth,
1111         .eh_abort_handler               = mptscsih_abort,
1112         .eh_device_reset_handler        = mptscsih_dev_reset,
1113         .eh_bus_reset_handler           = mptscsih_bus_reset,
1114         .eh_host_reset_handler          = mptscsih_host_reset,
1115         .bios_param                     = mptscsih_bios_param,
1116         .can_queue                      = MPT_FC_CAN_QUEUE,
1117         .this_id                        = -1,
1118         .sg_tablesize                   = MPT_SCSI_SG_DEPTH,
1119         .max_sectors                    = 8192,
1120         .cmd_per_lun                    = 7,
1121         .use_clustering                 = ENABLE_CLUSTERING,
1122 };
1123
1124 static int mptsas_get_linkerrors(struct sas_phy *phy)
1125 {
1126         MPT_ADAPTER *ioc = phy_to_ioc(phy);
1127         ConfigExtendedPageHeader_t hdr;
1128         CONFIGPARMS cfg;
1129         SasPhyPage1_t *buffer;
1130         dma_addr_t dma_handle;
1131         int error;
1132
1133         /* FIXME: only have link errors on local phys */
1134         if (!scsi_is_sas_phy_local(phy))
1135                 return -EINVAL;
1136
1137         hdr.PageVersion = MPI_SASPHY1_PAGEVERSION;
1138         hdr.ExtPageLength = 0;
1139         hdr.PageNumber = 1 /* page number 1*/;
1140         hdr.Reserved1 = 0;
1141         hdr.Reserved2 = 0;
1142         hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1143         hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_PHY;
1144
1145         cfg.cfghdr.ehdr = &hdr;
1146         cfg.physAddr = -1;
1147         cfg.pageAddr = phy->identify.phy_identifier;
1148         cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1149         cfg.dir = 0;    /* read */
1150         cfg.timeout = 10;
1151
1152         error = mpt_config(ioc, &cfg);
1153         if (error)
1154                 return error;
1155         if (!hdr.ExtPageLength)
1156                 return -ENXIO;
1157
1158         buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1159                                       &dma_handle);
1160         if (!buffer)
1161                 return -ENOMEM;
1162
1163         cfg.physAddr = dma_handle;
1164         cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1165
1166         error = mpt_config(ioc, &cfg);
1167         if (error)
1168                 goto out_free_consistent;
1169
1170         mptsas_print_phy_pg1(buffer);
1171
1172         phy->invalid_dword_count = le32_to_cpu(buffer->InvalidDwordCount);
1173         phy->running_disparity_error_count =
1174                 le32_to_cpu(buffer->RunningDisparityErrorCount);
1175         phy->loss_of_dword_sync_count =
1176                 le32_to_cpu(buffer->LossDwordSynchCount);
1177         phy->phy_reset_problem_count =
1178                 le32_to_cpu(buffer->PhyResetProblemCount);
1179
1180  out_free_consistent:
1181         pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1182                             buffer, dma_handle);
1183         return error;
1184 }
1185
1186 static int mptsas_mgmt_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req,
1187                 MPT_FRAME_HDR *reply)
1188 {
1189         ioc->sas_mgmt.status |= MPT_SAS_MGMT_STATUS_COMMAND_GOOD;
1190         if (reply != NULL) {
1191                 ioc->sas_mgmt.status |= MPT_SAS_MGMT_STATUS_RF_VALID;
1192                 memcpy(ioc->sas_mgmt.reply, reply,
1193                     min(ioc->reply_sz, 4 * reply->u.reply.MsgLength));
1194         }
1195         complete(&ioc->sas_mgmt.done);
1196         return 1;
1197 }
1198
1199 static int mptsas_phy_reset(struct sas_phy *phy, int hard_reset)
1200 {
1201         MPT_ADAPTER *ioc = phy_to_ioc(phy);
1202         SasIoUnitControlRequest_t *req;
1203         SasIoUnitControlReply_t *reply;
1204         MPT_FRAME_HDR *mf;
1205         MPIHeader_t *hdr;
1206         unsigned long timeleft;
1207         int error = -ERESTARTSYS;
1208
1209         /* FIXME: fusion doesn't allow non-local phy reset */
1210         if (!scsi_is_sas_phy_local(phy))
1211                 return -EINVAL;
1212
1213         /* not implemented for expanders */
1214         if (phy->identify.target_port_protocols & SAS_PROTOCOL_SMP)
1215                 return -ENXIO;
1216
1217         if (mutex_lock_interruptible(&ioc->sas_mgmt.mutex))
1218                 goto out;
1219
1220         mf = mpt_get_msg_frame(mptsasMgmtCtx, ioc);
1221         if (!mf) {
1222                 error = -ENOMEM;
1223                 goto out_unlock;
1224         }
1225
1226         hdr = (MPIHeader_t *) mf;
1227         req = (SasIoUnitControlRequest_t *)mf;
1228         memset(req, 0, sizeof(SasIoUnitControlRequest_t));
1229         req->Function = MPI_FUNCTION_SAS_IO_UNIT_CONTROL;
1230         req->MsgContext = hdr->MsgContext;
1231         req->Operation = hard_reset ?
1232                 MPI_SAS_OP_PHY_HARD_RESET : MPI_SAS_OP_PHY_LINK_RESET;
1233         req->PhyNum = phy->identify.phy_identifier;
1234
1235         mpt_put_msg_frame(mptsasMgmtCtx, ioc, mf);
1236
1237         timeleft = wait_for_completion_timeout(&ioc->sas_mgmt.done,
1238                         10 * HZ);
1239         if (!timeleft) {
1240                 /* On timeout reset the board */
1241                 mpt_free_msg_frame(ioc, mf);
1242                 mpt_HardResetHandler(ioc, CAN_SLEEP);
1243                 error = -ETIMEDOUT;
1244                 goto out_unlock;
1245         }
1246
1247         /* a reply frame is expected */
1248         if ((ioc->sas_mgmt.status &
1249             MPT_IOCTL_STATUS_RF_VALID) == 0) {
1250                 error = -ENXIO;
1251                 goto out_unlock;
1252         }
1253
1254         /* process the completed Reply Message Frame */
1255         reply = (SasIoUnitControlReply_t *)ioc->sas_mgmt.reply;
1256         if (reply->IOCStatus != MPI_IOCSTATUS_SUCCESS) {
1257                 printk("%s: IOCStatus=0x%X IOCLogInfo=0x%X\n",
1258                     __FUNCTION__,
1259                     reply->IOCStatus,
1260                     reply->IOCLogInfo);
1261                 error = -ENXIO;
1262                 goto out_unlock;
1263         }
1264
1265         error = 0;
1266
1267  out_unlock:
1268         mutex_unlock(&ioc->sas_mgmt.mutex);
1269  out:
1270         return error;
1271 }
1272
1273 static int
1274 mptsas_get_enclosure_identifier(struct sas_rphy *rphy, u64 *identifier)
1275 {
1276         MPT_ADAPTER *ioc = rphy_to_ioc(rphy);
1277         int i, error;
1278         struct mptsas_portinfo *p;
1279         struct mptsas_enclosure enclosure_info;
1280         u64 enclosure_handle;
1281
1282         mutex_lock(&ioc->sas_topology_mutex);
1283         list_for_each_entry(p, &ioc->sas_topology, list) {
1284                 for (i = 0; i < p->num_phys; i++) {
1285                         if (p->phy_info[i].attached.sas_address ==
1286                             rphy->identify.sas_address) {
1287                                 enclosure_handle = p->phy_info[i].
1288                                         attached.handle_enclosure;
1289                                 goto found_info;
1290                         }
1291                 }
1292         }
1293         mutex_unlock(&ioc->sas_topology_mutex);
1294         return -ENXIO;
1295
1296  found_info:
1297         mutex_unlock(&ioc->sas_topology_mutex);
1298         memset(&enclosure_info, 0, sizeof(struct mptsas_enclosure));
1299         error = mptsas_sas_enclosure_pg0(ioc, &enclosure_info,
1300                         (MPI_SAS_ENCLOS_PGAD_FORM_HANDLE <<
1301                          MPI_SAS_ENCLOS_PGAD_FORM_SHIFT), enclosure_handle);
1302         if (!error)
1303                 *identifier = enclosure_info.enclosure_logical_id;
1304         return error;
1305 }
1306
1307 static int
1308 mptsas_get_bay_identifier(struct sas_rphy *rphy)
1309 {
1310         MPT_ADAPTER *ioc = rphy_to_ioc(rphy);
1311         struct mptsas_portinfo *p;
1312         int i, rc;
1313
1314         mutex_lock(&ioc->sas_topology_mutex);
1315         list_for_each_entry(p, &ioc->sas_topology, list) {
1316                 for (i = 0; i < p->num_phys; i++) {
1317                         if (p->phy_info[i].attached.sas_address ==
1318                             rphy->identify.sas_address) {
1319                                 rc = p->phy_info[i].attached.slot;
1320                                 goto out;
1321                         }
1322                 }
1323         }
1324         rc = -ENXIO;
1325  out:
1326         mutex_unlock(&ioc->sas_topology_mutex);
1327         return rc;
1328 }
1329
1330 static struct sas_function_template mptsas_transport_functions = {
1331         .get_linkerrors         = mptsas_get_linkerrors,
1332         .get_enclosure_identifier = mptsas_get_enclosure_identifier,
1333         .get_bay_identifier     = mptsas_get_bay_identifier,
1334         .phy_reset              = mptsas_phy_reset,
1335 };
1336
1337 static struct scsi_transport_template *mptsas_transport_template;
1338
1339 static int
1340 mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
1341 {
1342         ConfigExtendedPageHeader_t hdr;
1343         CONFIGPARMS cfg;
1344         SasIOUnitPage0_t *buffer;
1345         dma_addr_t dma_handle;
1346         int error, i;
1347
1348         hdr.PageVersion = MPI_SASIOUNITPAGE0_PAGEVERSION;
1349         hdr.ExtPageLength = 0;
1350         hdr.PageNumber = 0;
1351         hdr.Reserved1 = 0;
1352         hdr.Reserved2 = 0;
1353         hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1354         hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT;
1355
1356         cfg.cfghdr.ehdr = &hdr;
1357         cfg.physAddr = -1;
1358         cfg.pageAddr = 0;
1359         cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1360         cfg.dir = 0;    /* read */
1361         cfg.timeout = 10;
1362
1363         error = mpt_config(ioc, &cfg);
1364         if (error)
1365                 goto out;
1366         if (!hdr.ExtPageLength) {
1367                 error = -ENXIO;
1368                 goto out;
1369         }
1370
1371         buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1372                                             &dma_handle);
1373         if (!buffer) {
1374                 error = -ENOMEM;
1375                 goto out;
1376         }
1377
1378         cfg.physAddr = dma_handle;
1379         cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1380
1381         error = mpt_config(ioc, &cfg);
1382         if (error)
1383                 goto out_free_consistent;
1384
1385         port_info->num_phys = buffer->NumPhys;
1386         port_info->phy_info = kcalloc(port_info->num_phys,
1387                 sizeof(*port_info->phy_info),GFP_KERNEL);
1388         if (!port_info->phy_info) {
1389                 error = -ENOMEM;
1390                 goto out_free_consistent;
1391         }
1392
1393         for (i = 0; i < port_info->num_phys; i++) {
1394                 mptsas_print_phy_data(&buffer->PhyData[i]);
1395                 port_info->phy_info[i].phy_id = i;
1396                 port_info->phy_info[i].port_id =
1397                     buffer->PhyData[i].Port;
1398                 port_info->phy_info[i].negotiated_link_rate =
1399                     buffer->PhyData[i].NegotiatedLinkRate;
1400                 port_info->phy_info[i].portinfo = port_info;
1401                 port_info->phy_info[i].handle =
1402                     le16_to_cpu(buffer->PhyData[i].ControllerDevHandle);
1403         }
1404
1405  out_free_consistent:
1406         pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1407                             buffer, dma_handle);
1408  out:
1409         return error;
1410 }
1411
1412 static int
1413 mptsas_sas_phy_pg0(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
1414                 u32 form, u32 form_specific)
1415 {
1416         ConfigExtendedPageHeader_t hdr;
1417         CONFIGPARMS cfg;
1418         SasPhyPage0_t *buffer;
1419         dma_addr_t dma_handle;
1420         int error;
1421
1422         hdr.PageVersion = MPI_SASPHY0_PAGEVERSION;
1423         hdr.ExtPageLength = 0;
1424         hdr.PageNumber = 0;
1425         hdr.Reserved1 = 0;
1426         hdr.Reserved2 = 0;
1427         hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1428         hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_PHY;
1429
1430         cfg.cfghdr.ehdr = &hdr;
1431         cfg.dir = 0;    /* read */
1432         cfg.timeout = 10;
1433
1434         /* Get Phy Pg 0 for each Phy. */
1435         cfg.physAddr = -1;
1436         cfg.pageAddr = form + form_specific;
1437         cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1438
1439         error = mpt_config(ioc, &cfg);
1440         if (error)
1441                 goto out;
1442
1443         if (!hdr.ExtPageLength) {
1444                 error = -ENXIO;
1445                 goto out;
1446         }
1447
1448         buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1449                                       &dma_handle);
1450         if (!buffer) {
1451                 error = -ENOMEM;
1452                 goto out;
1453         }
1454
1455         cfg.physAddr = dma_handle;
1456         cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1457
1458         error = mpt_config(ioc, &cfg);
1459         if (error)
1460                 goto out_free_consistent;
1461
1462         mptsas_print_phy_pg0(buffer);
1463
1464         phy_info->hw_link_rate = buffer->HwLinkRate;
1465         phy_info->programmed_link_rate = buffer->ProgrammedLinkRate;
1466         phy_info->identify.handle = le16_to_cpu(buffer->OwnerDevHandle);
1467         phy_info->attached.handle = le16_to_cpu(buffer->AttachedDevHandle);
1468
1469  out_free_consistent:
1470         pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1471                             buffer, dma_handle);
1472  out:
1473         return error;
1474 }
1475
1476 static int
1477 mptsas_sas_device_pg0(MPT_ADAPTER *ioc, struct mptsas_devinfo *device_info,
1478                 u32 form, u32 form_specific)
1479 {
1480         ConfigExtendedPageHeader_t hdr;
1481         CONFIGPARMS cfg;
1482         SasDevicePage0_t *buffer;
1483         dma_addr_t dma_handle;
1484         __le64 sas_address;
1485         int error=0;
1486
1487         if (ioc->sas_discovery_runtime &&
1488                 mptsas_is_end_device(device_info))
1489                         goto out;
1490
1491         hdr.PageVersion = MPI_SASDEVICE0_PAGEVERSION;
1492         hdr.ExtPageLength = 0;
1493         hdr.PageNumber = 0;
1494         hdr.Reserved1 = 0;
1495         hdr.Reserved2 = 0;
1496         hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1497         hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE;
1498
1499         cfg.cfghdr.ehdr = &hdr;
1500         cfg.pageAddr = form + form_specific;
1501         cfg.physAddr = -1;
1502         cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1503         cfg.dir = 0;    /* read */
1504         cfg.timeout = 10;
1505
1506         memset(device_info, 0, sizeof(struct mptsas_devinfo));
1507         error = mpt_config(ioc, &cfg);
1508         if (error)
1509                 goto out;
1510         if (!hdr.ExtPageLength) {
1511                 error = -ENXIO;
1512                 goto out;
1513         }
1514
1515         buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1516                                       &dma_handle);
1517         if (!buffer) {
1518                 error = -ENOMEM;
1519                 goto out;
1520         }
1521
1522         cfg.physAddr = dma_handle;
1523         cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1524
1525         error = mpt_config(ioc, &cfg);
1526         if (error)
1527                 goto out_free_consistent;
1528
1529         mptsas_print_device_pg0(buffer);
1530
1531         device_info->handle = le16_to_cpu(buffer->DevHandle);
1532         device_info->handle_parent = le16_to_cpu(buffer->ParentDevHandle);
1533         device_info->handle_enclosure =
1534             le16_to_cpu(buffer->EnclosureHandle);
1535         device_info->slot = le16_to_cpu(buffer->Slot);
1536         device_info->phy_id = buffer->PhyNum;
1537         device_info->port_id = buffer->PhysicalPort;
1538         device_info->id = buffer->TargetID;
1539         device_info->phys_disk_num = ~0;
1540         device_info->channel = buffer->Bus;
1541         memcpy(&sas_address, &buffer->SASAddress, sizeof(__le64));
1542         device_info->sas_address = le64_to_cpu(sas_address);
1543         device_info->device_info =
1544             le32_to_cpu(buffer->DeviceInfo);
1545
1546  out_free_consistent:
1547         pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1548                             buffer, dma_handle);
1549  out:
1550         return error;
1551 }
1552
1553 static int
1554 mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info,
1555                 u32 form, u32 form_specific)
1556 {
1557         ConfigExtendedPageHeader_t hdr;
1558         CONFIGPARMS cfg;
1559         SasExpanderPage0_t *buffer;
1560         dma_addr_t dma_handle;
1561         int i, error;
1562
1563         hdr.PageVersion = MPI_SASEXPANDER0_PAGEVERSION;
1564         hdr.ExtPageLength = 0;
1565         hdr.PageNumber = 0;
1566         hdr.Reserved1 = 0;
1567         hdr.Reserved2 = 0;
1568         hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1569         hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER;
1570
1571         cfg.cfghdr.ehdr = &hdr;
1572         cfg.physAddr = -1;
1573         cfg.pageAddr = form + form_specific;
1574         cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1575         cfg.dir = 0;    /* read */
1576         cfg.timeout = 10;
1577
1578         memset(port_info, 0, sizeof(struct mptsas_portinfo));
1579         error = mpt_config(ioc, &cfg);
1580         if (error)
1581                 goto out;
1582
1583         if (!hdr.ExtPageLength) {
1584                 error = -ENXIO;
1585                 goto out;
1586         }
1587
1588         buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1589                                       &dma_handle);
1590         if (!buffer) {
1591                 error = -ENOMEM;
1592                 goto out;
1593         }
1594
1595         cfg.physAddr = dma_handle;
1596         cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1597
1598         error = mpt_config(ioc, &cfg);
1599         if (error)
1600                 goto out_free_consistent;
1601
1602         /* save config data */
1603         port_info->num_phys = buffer->NumPhys;
1604         port_info->phy_info = kcalloc(port_info->num_phys,
1605                 sizeof(*port_info->phy_info),GFP_KERNEL);
1606         if (!port_info->phy_info) {
1607                 error = -ENOMEM;
1608                 goto out_free_consistent;
1609         }
1610
1611         for (i = 0; i < port_info->num_phys; i++) {
1612                 port_info->phy_info[i].portinfo = port_info;
1613                 port_info->phy_info[i].handle =
1614                     le16_to_cpu(buffer->DevHandle);
1615         }
1616
1617  out_free_consistent:
1618         pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1619                             buffer, dma_handle);
1620  out:
1621         return error;
1622 }
1623
1624 static int
1625 mptsas_sas_expander_pg1(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
1626                 u32 form, u32 form_specific)
1627 {
1628         ConfigExtendedPageHeader_t hdr;
1629         CONFIGPARMS cfg;
1630         SasExpanderPage1_t *buffer;
1631         dma_addr_t dma_handle;
1632         int error=0;
1633
1634         if (ioc->sas_discovery_runtime &&
1635                 mptsas_is_end_device(&phy_info->attached))
1636                         goto out;
1637
1638         hdr.PageVersion = MPI_SASEXPANDER0_PAGEVERSION;
1639         hdr.ExtPageLength = 0;
1640         hdr.PageNumber = 1;
1641         hdr.Reserved1 = 0;
1642         hdr.Reserved2 = 0;
1643         hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
1644         hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER;
1645
1646         cfg.cfghdr.ehdr = &hdr;
1647         cfg.physAddr = -1;
1648         cfg.pageAddr = form + form_specific;
1649         cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
1650         cfg.dir = 0;    /* read */
1651         cfg.timeout = 10;
1652
1653         error = mpt_config(ioc, &cfg);
1654         if (error)
1655                 goto out;
1656
1657         if (!hdr.ExtPageLength) {
1658                 error = -ENXIO;
1659                 goto out;
1660         }
1661
1662         buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1663                                       &dma_handle);
1664         if (!buffer) {
1665                 error = -ENOMEM;
1666                 goto out;
1667         }
1668
1669         cfg.physAddr = dma_handle;
1670         cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
1671
1672         error = mpt_config(ioc, &cfg);
1673         if (error)
1674                 goto out_free_consistent;
1675
1676
1677         mptsas_print_expander_pg1(buffer);
1678
1679         /* save config data */
1680         phy_info->phy_id = buffer->PhyIdentifier;
1681         phy_info->port_id = buffer->PhysicalPort;
1682         phy_info->negotiated_link_rate = buffer->NegotiatedLinkRate;
1683         phy_info->programmed_link_rate = buffer->ProgrammedLinkRate;
1684         phy_info->hw_link_rate = buffer->HwLinkRate;
1685         phy_info->identify.handle = le16_to_cpu(buffer->OwnerDevHandle);
1686         phy_info->attached.handle = le16_to_cpu(buffer->AttachedDevHandle);
1687
1688  out_free_consistent:
1689         pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
1690                             buffer, dma_handle);
1691  out:
1692         return error;
1693 }
1694
1695 static void
1696 mptsas_parse_device_info(struct sas_identify *identify,
1697                 struct mptsas_devinfo *device_info)
1698 {
1699         u16 protocols;
1700
1701         identify->sas_address = device_info->sas_address;
1702         identify->phy_identifier = device_info->phy_id;
1703
1704         /*
1705          * Fill in Phy Initiator Port Protocol.
1706          * Bits 6:3, more than one bit can be set, fall through cases.
1707          */
1708         protocols = device_info->device_info & 0x78;
1709         identify->initiator_port_protocols = 0;
1710         if (protocols & MPI_SAS_DEVICE_INFO_SSP_INITIATOR)
1711                 identify->initiator_port_protocols |= SAS_PROTOCOL_SSP;
1712         if (protocols & MPI_SAS_DEVICE_INFO_STP_INITIATOR)
1713                 identify->initiator_port_protocols |= SAS_PROTOCOL_STP;
1714         if (protocols & MPI_SAS_DEVICE_INFO_SMP_INITIATOR)
1715                 identify->initiator_port_protocols |= SAS_PROTOCOL_SMP;
1716         if (protocols & MPI_SAS_DEVICE_INFO_SATA_HOST)
1717                 identify->initiator_port_protocols |= SAS_PROTOCOL_SATA;
1718
1719         /*
1720          * Fill in Phy Target Port Protocol.
1721          * Bits 10:7, more than one bit can be set, fall through cases.
1722          */
1723         protocols = device_info->device_info & 0x780;
1724         identify->target_port_protocols = 0;
1725         if (protocols & MPI_SAS_DEVICE_INFO_SSP_TARGET)
1726                 identify->target_port_protocols |= SAS_PROTOCOL_SSP;
1727         if (protocols & MPI_SAS_DEVICE_INFO_STP_TARGET)
1728                 identify->target_port_protocols |= SAS_PROTOCOL_STP;
1729         if (protocols & MPI_SAS_DEVICE_INFO_SMP_TARGET)
1730                 identify->target_port_protocols |= SAS_PROTOCOL_SMP;
1731         if (protocols & MPI_SAS_DEVICE_INFO_SATA_DEVICE)
1732                 identify->target_port_protocols |= SAS_PROTOCOL_SATA;
1733
1734         /*
1735          * Fill in Attached device type.
1736          */
1737         switch (device_info->device_info &
1738                         MPI_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) {
1739         case MPI_SAS_DEVICE_INFO_NO_DEVICE:
1740                 identify->device_type = SAS_PHY_UNUSED;
1741                 break;
1742         case MPI_SAS_DEVICE_INFO_END_DEVICE:
1743                 identify->device_type = SAS_END_DEVICE;
1744                 break;
1745         case MPI_SAS_DEVICE_INFO_EDGE_EXPANDER:
1746                 identify->device_type = SAS_EDGE_EXPANDER_DEVICE;
1747                 break;
1748         case MPI_SAS_DEVICE_INFO_FANOUT_EXPANDER:
1749                 identify->device_type = SAS_FANOUT_EXPANDER_DEVICE;
1750                 break;
1751         }
1752 }
1753
1754 static int mptsas_probe_one_phy(struct device *dev,
1755                 struct mptsas_phyinfo *phy_info, int index, int local)
1756 {
1757         MPT_ADAPTER *ioc;
1758         struct sas_phy *phy;
1759         struct sas_port *port;
1760         int error = 0;
1761
1762         if (!dev) {
1763                 error = -ENODEV;
1764                 goto out;
1765         }
1766
1767         if (!phy_info->phy) {
1768                 phy = sas_phy_alloc(dev, index);
1769                 if (!phy) {
1770                         error = -ENOMEM;
1771                         goto out;
1772                 }
1773         } else
1774                 phy = phy_info->phy;
1775
1776         mptsas_parse_device_info(&phy->identify, &phy_info->identify);
1777
1778         /*
1779          * Set Negotiated link rate.
1780          */
1781         switch (phy_info->negotiated_link_rate) {
1782         case MPI_SAS_IOUNIT0_RATE_PHY_DISABLED:
1783                 phy->negotiated_linkrate = SAS_PHY_DISABLED;
1784                 break;
1785         case MPI_SAS_IOUNIT0_RATE_FAILED_SPEED_NEGOTIATION:
1786                 phy->negotiated_linkrate = SAS_LINK_RATE_FAILED;
1787                 break;
1788         case MPI_SAS_IOUNIT0_RATE_1_5:
1789                 phy->negotiated_linkrate = SAS_LINK_RATE_1_5_GBPS;
1790                 break;
1791         case MPI_SAS_IOUNIT0_RATE_3_0:
1792                 phy->negotiated_linkrate = SAS_LINK_RATE_3_0_GBPS;
1793                 break;
1794         case MPI_SAS_IOUNIT0_RATE_SATA_OOB_COMPLETE:
1795         case MPI_SAS_IOUNIT0_RATE_UNKNOWN:
1796         default:
1797                 phy->negotiated_linkrate = SAS_LINK_RATE_UNKNOWN;
1798                 break;
1799         }
1800
1801         /*
1802          * Set Max hardware link rate.
1803          */
1804         switch (phy_info->hw_link_rate & MPI_SAS_PHY0_PRATE_MAX_RATE_MASK) {
1805         case MPI_SAS_PHY0_HWRATE_MAX_RATE_1_5:
1806                 phy->maximum_linkrate_hw = SAS_LINK_RATE_1_5_GBPS;
1807                 break;
1808         case MPI_SAS_PHY0_PRATE_MAX_RATE_3_0:
1809                 phy->maximum_linkrate_hw = SAS_LINK_RATE_3_0_GBPS;
1810                 break;
1811         default:
1812                 break;
1813         }
1814
1815         /*
1816          * Set Max programmed link rate.
1817          */
1818         switch (phy_info->programmed_link_rate &
1819                         MPI_SAS_PHY0_PRATE_MAX_RATE_MASK) {
1820         case MPI_SAS_PHY0_PRATE_MAX_RATE_1_5:
1821                 phy->maximum_linkrate = SAS_LINK_RATE_1_5_GBPS;
1822                 break;
1823         case MPI_SAS_PHY0_PRATE_MAX_RATE_3_0:
1824                 phy->maximum_linkrate = SAS_LINK_RATE_3_0_GBPS;
1825                 break;
1826         default:
1827                 break;
1828         }
1829
1830         /*
1831          * Set Min hardware link rate.
1832          */
1833         switch (phy_info->hw_link_rate & MPI_SAS_PHY0_HWRATE_MIN_RATE_MASK) {
1834         case MPI_SAS_PHY0_HWRATE_MIN_RATE_1_5:
1835                 phy->minimum_linkrate_hw = SAS_LINK_RATE_1_5_GBPS;
1836                 break;
1837         case MPI_SAS_PHY0_PRATE_MIN_RATE_3_0:
1838                 phy->minimum_linkrate_hw = SAS_LINK_RATE_3_0_GBPS;
1839                 break;
1840         default:
1841                 break;
1842         }
1843
1844         /*
1845          * Set Min programmed link rate.
1846          */
1847         switch (phy_info->programmed_link_rate &
1848                         MPI_SAS_PHY0_PRATE_MIN_RATE_MASK) {
1849         case MPI_SAS_PHY0_PRATE_MIN_RATE_1_5:
1850                 phy->minimum_linkrate = SAS_LINK_RATE_1_5_GBPS;
1851                 break;
1852         case MPI_SAS_PHY0_PRATE_MIN_RATE_3_0:
1853                 phy->minimum_linkrate = SAS_LINK_RATE_3_0_GBPS;
1854                 break;
1855         default:
1856                 break;
1857         }
1858
1859         if (!phy_info->phy) {
1860
1861                 error = sas_phy_add(phy);
1862                 if (error) {
1863                         sas_phy_free(phy);
1864                         goto out;
1865                 }
1866                 phy_info->phy = phy;
1867         }
1868
1869         if (!phy_info->attached.handle ||
1870                         !phy_info->port_details)
1871                 goto out;
1872
1873         port = mptsas_get_port(phy_info);
1874         ioc = phy_to_ioc(phy_info->phy);
1875
1876         if (phy_info->sas_port_add_phy) {
1877
1878                 if (!port) {
1879                         port = sas_port_alloc_num(dev);
1880                         if (!port) {
1881                                 error = -ENOMEM;
1882                                 goto out;
1883                         }
1884                         error = sas_port_add(port);
1885                         if (error) {
1886                                 dfailprintk((MYIOC_s_ERR_FMT
1887                                         "%s: exit at line=%d\n", ioc->name,
1888                                         __FUNCTION__, __LINE__));
1889                                 goto out;
1890                         }
1891                         mptsas_set_port(phy_info, port);
1892                         dsaswideprintk((KERN_DEBUG
1893                             "sas_port_alloc: port=%p dev=%p port_id=%d\n",
1894                             port, dev, port->port_identifier));
1895                 }
1896                 dsaswideprintk((KERN_DEBUG "sas_port_add_phy: phy_id=%d\n",
1897                     phy_info->phy_id));
1898                 sas_port_add_phy(port, phy_info->phy);
1899                 phy_info->sas_port_add_phy = 0;
1900         }
1901
1902         if (!mptsas_get_rphy(phy_info) && port && !port->rphy) {
1903
1904                 struct sas_rphy *rphy;
1905                 struct device *parent;
1906                 struct sas_identify identify;
1907
1908                 parent = dev->parent->parent;
1909                 /*
1910                  * Let the hotplug_work thread handle processing
1911                  * the adding/removing of devices that occur
1912                  * after start of day.
1913                  */
1914                 if (ioc->sas_discovery_runtime &&
1915                         mptsas_is_end_device(&phy_info->attached))
1916                                 goto out;
1917
1918                 mptsas_parse_device_info(&identify, &phy_info->attached);
1919                 if (scsi_is_host_device(parent)) {
1920                         struct mptsas_portinfo *port_info;
1921                         int i;
1922
1923                         mutex_lock(&ioc->sas_topology_mutex);
1924                         port_info = mptsas_find_portinfo_by_handle(ioc,
1925                                                                    ioc->handle);
1926                         mutex_unlock(&ioc->sas_topology_mutex);
1927
1928                         for (i = 0; i < port_info->num_phys; i++)
1929                                 if (port_info->phy_info[i].identify.sas_address ==
1930                                     identify.sas_address) {
1931                                         sas_port_mark_backlink(port);
1932                                         goto out;
1933                                 }
1934
1935                 } else if (scsi_is_sas_rphy(parent)) {
1936                         struct sas_rphy *parent_rphy = dev_to_rphy(parent);
1937                         if (identify.sas_address ==
1938                             parent_rphy->identify.sas_address) {
1939                                 sas_port_mark_backlink(port);
1940                                 goto out;
1941                         }
1942                 }
1943
1944                 switch (identify.device_type) {
1945                 case SAS_END_DEVICE:
1946                         rphy = sas_end_device_alloc(port);
1947                         break;
1948                 case SAS_EDGE_EXPANDER_DEVICE:
1949                 case SAS_FANOUT_EXPANDER_DEVICE:
1950                         rphy = sas_expander_alloc(port, identify.device_type);
1951                         break;
1952                 default:
1953                         rphy = NULL;
1954                         break;
1955                 }
1956                 if (!rphy) {
1957                         dfailprintk((MYIOC_s_ERR_FMT
1958                                 "%s: exit at line=%d\n", ioc->name,
1959                                 __FUNCTION__, __LINE__));
1960                         goto out;
1961                 }
1962
1963                 rphy->identify = identify;
1964                 error = sas_rphy_add(rphy);
1965                 if (error) {
1966                         dfailprintk((MYIOC_s_ERR_FMT
1967                                 "%s: exit at line=%d\n", ioc->name,
1968                                 __FUNCTION__, __LINE__));
1969                         sas_rphy_free(rphy);
1970                         goto out;
1971                 }
1972                 mptsas_set_rphy(phy_info, rphy);
1973         }
1974
1975  out:
1976         return error;
1977 }
1978
1979 static int
1980 mptsas_probe_hba_phys(MPT_ADAPTER *ioc)
1981 {
1982         struct mptsas_portinfo *port_info, *hba;
1983         int error = -ENOMEM, i;
1984
1985         hba = kzalloc(sizeof(*port_info), GFP_KERNEL);
1986         if (! hba)
1987                 goto out;
1988
1989         error = mptsas_sas_io_unit_pg0(ioc, hba);
1990         if (error)
1991                 goto out_free_port_info;
1992
1993         mutex_lock(&ioc->sas_topology_mutex);
1994         ioc->handle = hba->phy_info[0].handle;
1995         port_info = mptsas_find_portinfo_by_handle(ioc, ioc->handle);
1996         if (!port_info) {
1997                 port_info = hba;
1998                 list_add_tail(&port_info->list, &ioc->sas_topology);
1999         } else {
2000                 for (i = 0; i < hba->num_phys; i++) {
2001                         port_info->phy_info[i].negotiated_link_rate =
2002                                 hba->phy_info[i].negotiated_link_rate;
2003                         port_info->phy_info[i].handle =
2004                                 hba->phy_info[i].handle;
2005                         port_info->phy_info[i].port_id =
2006                                 hba->phy_info[i].port_id;
2007                 }
2008                 kfree(hba->phy_info);
2009                 kfree(hba);
2010                 hba = NULL;
2011         }
2012         mutex_unlock(&ioc->sas_topology_mutex);
2013         for (i = 0; i < port_info->num_phys; i++) {
2014                 mptsas_sas_phy_pg0(ioc, &port_info->phy_info[i],
2015                         (MPI_SAS_PHY_PGAD_FORM_PHY_NUMBER <<
2016                          MPI_SAS_PHY_PGAD_FORM_SHIFT), i);
2017
2018                 mptsas_sas_device_pg0(ioc, &port_info->phy_info[i].identify,
2019                         (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
2020                          MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2021                          port_info->phy_info[i].handle);
2022                 port_info->phy_info[i].identify.phy_id =
2023                     port_info->phy_info[i].phy_id = i;
2024                 if (port_info->phy_info[i].attached.handle)
2025                         mptsas_sas_device_pg0(ioc,
2026                                 &port_info->phy_info[i].attached,
2027                                 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
2028                                  MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2029                                 port_info->phy_info[i].attached.handle);
2030         }
2031
2032         mptsas_setup_wide_ports(ioc, port_info);
2033
2034         for (i = 0; i < port_info->num_phys; i++, ioc->sas_index++)
2035                 mptsas_probe_one_phy(&ioc->sh->shost_gendev,
2036                     &port_info->phy_info[i], ioc->sas_index, 1);
2037
2038         return 0;
2039
2040  out_free_port_info:
2041         kfree(hba);
2042  out:
2043         return error;
2044 }
2045
2046 static int
2047 mptsas_probe_expander_phys(MPT_ADAPTER *ioc, u32 *handle)
2048 {
2049         struct mptsas_portinfo *port_info, *p, *ex;
2050         struct device *parent;
2051         struct sas_rphy *rphy;
2052         int error = -ENOMEM, i, j;
2053
2054         ex = kzalloc(sizeof(*port_info), GFP_KERNEL);
2055         if (!ex)
2056                 goto out;
2057
2058         error = mptsas_sas_expander_pg0(ioc, ex,
2059             (MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE <<
2060              MPI_SAS_EXPAND_PGAD_FORM_SHIFT), *handle);
2061         if (error)
2062                 goto out_free_port_info;
2063
2064         *handle = ex->phy_info[0].handle;
2065
2066         mutex_lock(&ioc->sas_topology_mutex);
2067         port_info = mptsas_find_portinfo_by_handle(ioc, *handle);
2068         if (!port_info) {
2069                 port_info = ex;
2070                 list_add_tail(&port_info->list, &ioc->sas_topology);
2071         } else {
2072                 for (i = 0; i < ex->num_phys; i++) {
2073                         port_info->phy_info[i].handle =
2074                                 ex->phy_info[i].handle;
2075                         port_info->phy_info[i].port_id =
2076                                 ex->phy_info[i].port_id;
2077                 }
2078                 kfree(ex->phy_info);
2079                 kfree(ex);
2080                 ex = NULL;
2081         }
2082         mutex_unlock(&ioc->sas_topology_mutex);
2083
2084         for (i = 0; i < port_info->num_phys; i++) {
2085                 mptsas_sas_expander_pg1(ioc, &port_info->phy_info[i],
2086                         (MPI_SAS_EXPAND_PGAD_FORM_HANDLE_PHY_NUM <<
2087                          MPI_SAS_EXPAND_PGAD_FORM_SHIFT), (i << 16) + *handle);
2088
2089                 if (port_info->phy_info[i].identify.handle) {
2090                         mptsas_sas_device_pg0(ioc,
2091                                 &port_info->phy_info[i].identify,
2092                                 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
2093                                  MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2094                                 port_info->phy_info[i].identify.handle);
2095                         port_info->phy_info[i].identify.phy_id =
2096                             port_info->phy_info[i].phy_id;
2097                 }
2098
2099                 if (port_info->phy_info[i].attached.handle) {
2100                         mptsas_sas_device_pg0(ioc,
2101                                 &port_info->phy_info[i].attached,
2102                                 (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
2103                                  MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2104                                 port_info->phy_info[i].attached.handle);
2105                         port_info->phy_info[i].attached.phy_id =
2106                             port_info->phy_info[i].phy_id;
2107                 }
2108         }
2109
2110         parent = &ioc->sh->shost_gendev;
2111         for (i = 0; i < port_info->num_phys; i++) {
2112                 mutex_lock(&ioc->sas_topology_mutex);
2113                 list_for_each_entry(p, &ioc->sas_topology, list) {
2114                         for (j = 0; j < p->num_phys; j++) {
2115                                 if (port_info->phy_info[i].identify.handle !=
2116                                                 p->phy_info[j].attached.handle)
2117                                         continue;
2118                                 rphy = mptsas_get_rphy(&p->phy_info[j]);
2119                                 parent = &rphy->dev;
2120                         }
2121                 }
2122                 mutex_unlock(&ioc->sas_topology_mutex);
2123         }
2124
2125         mptsas_setup_wide_ports(ioc, port_info);
2126
2127         for (i = 0; i < port_info->num_phys; i++, ioc->sas_index++)
2128                 mptsas_probe_one_phy(parent, &port_info->phy_info[i],
2129                     ioc->sas_index, 0);
2130
2131         return 0;
2132
2133  out_free_port_info:
2134         if (ex) {
2135                 kfree(ex->phy_info);
2136                 kfree(ex);
2137         }
2138  out:
2139         return error;
2140 }
2141
2142 /*
2143  * mptsas_delete_expander_phys
2144  *
2145  *
2146  * This will traverse topology, and remove expanders
2147  * that are no longer present
2148  */
2149 static void
2150 mptsas_delete_expander_phys(MPT_ADAPTER *ioc)
2151 {
2152         struct mptsas_portinfo buffer;
2153         struct mptsas_portinfo *port_info, *n, *parent;
2154         struct mptsas_phyinfo *phy_info;
2155         struct sas_port * port;
2156         int i;
2157         u64     expander_sas_address;
2158
2159         mutex_lock(&ioc->sas_topology_mutex);
2160         list_for_each_entry_safe(port_info, n, &ioc->sas_topology, list) {
2161
2162                 if (port_info->phy_info &&
2163                     (!(port_info->phy_info[0].identify.device_info &
2164                     MPI_SAS_DEVICE_INFO_SMP_TARGET)))
2165                         continue;
2166
2167                 if (mptsas_sas_expander_pg0(ioc, &buffer,
2168                      (MPI_SAS_EXPAND_PGAD_FORM_HANDLE <<
2169                      MPI_SAS_EXPAND_PGAD_FORM_SHIFT),
2170                      port_info->phy_info[0].handle)) {
2171
2172                         /*
2173                          * Obtain the port_info instance to the parent port
2174                          */
2175                         parent = mptsas_find_portinfo_by_handle(ioc,
2176                             port_info->phy_info[0].identify.handle_parent);
2177
2178                         if (!parent)
2179                                 goto next_port;
2180
2181                         expander_sas_address =
2182                                 port_info->phy_info[0].identify.sas_address;
2183
2184                         /*
2185                          * Delete rphys in the parent that point
2186                          * to this expander.  The transport layer will
2187                          * cleanup all the children.
2188                          */
2189                         phy_info = parent->phy_info;
2190                         for (i = 0; i < parent->num_phys; i++, phy_info++) {
2191                                 port = mptsas_get_port(phy_info);
2192                                 if (!port)
2193                                         continue;
2194                                 if (phy_info->attached.sas_address !=
2195                                         expander_sas_address)
2196                                         continue;
2197 #ifdef MPT_DEBUG_SAS_WIDE
2198                                 dev_printk(KERN_DEBUG, &port->dev,
2199                                     "delete port (%d)\n", port->port_identifier);
2200 #endif
2201                                 sas_port_delete(port);
2202                                 mptsas_port_delete(phy_info->port_details);
2203                         }
2204  next_port:
2205
2206                         phy_info = port_info->phy_info;
2207                         for (i = 0; i < port_info->num_phys; i++, phy_info++)
2208                                 mptsas_port_delete(phy_info->port_details);
2209
2210                         list_del(&port_info->list);
2211                         kfree(port_info->phy_info);
2212                         kfree(port_info);
2213                 }
2214                 /*
2215                 * Free this memory allocated from inside
2216                 * mptsas_sas_expander_pg0
2217                 */
2218                 kfree(buffer.phy_info);
2219         }
2220         mutex_unlock(&ioc->sas_topology_mutex);
2221 }
2222
2223 /*
2224  * Start of day discovery
2225  */
2226 static void
2227 mptsas_scan_sas_topology(MPT_ADAPTER *ioc)
2228 {
2229         u32 handle = 0xFFFF;
2230         int i;
2231
2232         mutex_lock(&ioc->sas_discovery_mutex);
2233         mptsas_probe_hba_phys(ioc);
2234         while (!mptsas_probe_expander_phys(ioc, &handle))
2235                 ;
2236         /*
2237           Reporting RAID volumes.
2238         */
2239         if (!ioc->ir_firmware)
2240                 goto out;
2241         if (!ioc->raid_data.pIocPg2)
2242                 goto out;
2243         if (!ioc->raid_data.pIocPg2->NumActiveVolumes)
2244                 goto out;
2245         for (i = 0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++) {
2246                 scsi_add_device(ioc->sh, MPTSAS_RAID_CHANNEL,
2247                     ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID, 0);
2248         }
2249  out:
2250         mutex_unlock(&ioc->sas_discovery_mutex);
2251 }
2252
2253 /*
2254  * Work queue thread to handle Runtime discovery
2255  * Mere purpose is the hot add/delete of expanders
2256  *(Mutex UNLOCKED)
2257  */
2258 static void
2259 __mptsas_discovery_work(MPT_ADAPTER *ioc)
2260 {
2261         u32 handle = 0xFFFF;
2262
2263         ioc->sas_discovery_runtime=1;
2264         mptsas_delete_expander_phys(ioc);
2265         mptsas_probe_hba_phys(ioc);
2266         while (!mptsas_probe_expander_phys(ioc, &handle))
2267                 ;
2268         ioc->sas_discovery_runtime=0;
2269 }
2270
2271 /*
2272  * Work queue thread to handle Runtime discovery
2273  * Mere purpose is the hot add/delete of expanders
2274  *(Mutex LOCKED)
2275  */
2276 static void
2277 mptsas_discovery_work(struct work_struct *work)
2278 {
2279         struct mptsas_discovery_event *ev =
2280                 container_of(work, struct mptsas_discovery_event, work);
2281         MPT_ADAPTER *ioc = ev->ioc;
2282
2283         mutex_lock(&ioc->sas_discovery_mutex);
2284         __mptsas_discovery_work(ioc);
2285         mutex_unlock(&ioc->sas_discovery_mutex);
2286         kfree(ev);
2287 }
2288
2289 static struct mptsas_phyinfo *
2290 mptsas_find_phyinfo_by_sas_address(MPT_ADAPTER *ioc, u64 sas_address)
2291 {
2292         struct mptsas_portinfo *port_info;
2293         struct mptsas_phyinfo *phy_info = NULL;
2294         int i;
2295
2296         mutex_lock(&ioc->sas_topology_mutex);
2297         list_for_each_entry(port_info, &ioc->sas_topology, list) {
2298                 for (i = 0; i < port_info->num_phys; i++) {
2299                         if (!mptsas_is_end_device(
2300                                 &port_info->phy_info[i].attached))
2301                                 continue;
2302                         if (port_info->phy_info[i].attached.sas_address
2303                             != sas_address)
2304                                 continue;
2305                         phy_info = &port_info->phy_info[i];
2306                         break;
2307                 }
2308         }
2309         mutex_unlock(&ioc->sas_topology_mutex);
2310         return phy_info;
2311 }
2312
2313 static struct mptsas_phyinfo *
2314 mptsas_find_phyinfo_by_target(MPT_ADAPTER *ioc, u8 channel, u8 id)
2315 {
2316         struct mptsas_portinfo *port_info;
2317         struct mptsas_phyinfo *phy_info = NULL;
2318         int i;
2319
2320         mutex_lock(&ioc->sas_topology_mutex);
2321         list_for_each_entry(port_info, &ioc->sas_topology, list) {
2322                 for (i = 0; i < port_info->num_phys; i++) {
2323                         if (!mptsas_is_end_device(
2324                                 &port_info->phy_info[i].attached))
2325                                 continue;
2326                         if (port_info->phy_info[i].attached.id != id)
2327                                 continue;
2328                         if (port_info->phy_info[i].attached.channel != channel)
2329                                 continue;
2330                         phy_info = &port_info->phy_info[i];
2331                         break;
2332                 }
2333         }
2334         mutex_unlock(&ioc->sas_topology_mutex);
2335         return phy_info;
2336 }
2337
2338 static struct mptsas_phyinfo *
2339 mptsas_find_phyinfo_by_phys_disk_num(MPT_ADAPTER *ioc, u8 channel, u8 id)
2340 {
2341         struct mptsas_portinfo *port_info;
2342         struct mptsas_phyinfo *phy_info = NULL;
2343         int i;
2344
2345         mutex_lock(&ioc->sas_topology_mutex);
2346         list_for_each_entry(port_info, &ioc->sas_topology, list) {
2347                 for (i = 0; i < port_info->num_phys; i++) {
2348                         if (!mptsas_is_end_device(
2349                                 &port_info->phy_info[i].attached))
2350                                 continue;
2351                         if (port_info->phy_info[i].attached.phys_disk_num == ~0)
2352                                 continue;
2353                         if (port_info->phy_info[i].attached.phys_disk_num != id)
2354                                 continue;
2355                         if (port_info->phy_info[i].attached.channel != channel)
2356                                 continue;
2357                         phy_info = &port_info->phy_info[i];
2358                         break;
2359                 }
2360         }
2361         mutex_unlock(&ioc->sas_topology_mutex);
2362         return phy_info;
2363 }
2364
2365 /*
2366  * Work queue thread to clear the persitency table
2367  */
2368 static void
2369 mptsas_persist_clear_table(struct work_struct *work)
2370 {
2371         MPT_ADAPTER *ioc = container_of(work, MPT_ADAPTER, sas_persist_task);
2372
2373         mptbase_sas_persist_operation(ioc, MPI_SAS_OP_CLEAR_NOT_PRESENT);
2374 }
2375
2376 static void
2377 mptsas_reprobe_lun(struct scsi_device *sdev, void *data)
2378 {
2379         int rc;
2380
2381         sdev->no_uld_attach = data ? 1 : 0;
2382         rc = scsi_device_reprobe(sdev);
2383 }
2384
2385 static void
2386 mptsas_reprobe_target(struct scsi_target *starget, int uld_attach)
2387 {
2388         starget_for_each_device(starget, uld_attach ? (void *)1 : NULL,
2389                         mptsas_reprobe_lun);
2390 }
2391
2392 static void
2393 mptsas_adding_inactive_raid_components(MPT_ADAPTER *ioc, u8 channel, u8 id)
2394 {
2395         CONFIGPARMS                     cfg;
2396         ConfigPageHeader_t              hdr;
2397         dma_addr_t                      dma_handle;
2398         pRaidVolumePage0_t              buffer = NULL;
2399         RaidPhysDiskPage0_t             phys_disk;
2400         int                             i;
2401         struct mptsas_hotplug_event     *ev;
2402
2403         memset(&cfg, 0 , sizeof(CONFIGPARMS));
2404         memset(&hdr, 0 , sizeof(ConfigPageHeader_t));
2405         hdr.PageType = MPI_CONFIG_PAGETYPE_RAID_VOLUME;
2406         cfg.pageAddr = (channel << 8) + id;
2407         cfg.cfghdr.hdr = &hdr;
2408         cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
2409
2410         if (mpt_config(ioc, &cfg) != 0)
2411                 goto out;
2412
2413         if (!hdr.PageLength)
2414                 goto out;
2415
2416         buffer = pci_alloc_consistent(ioc->pcidev, hdr.PageLength * 4,
2417             &dma_handle);
2418
2419         if (!buffer)
2420                 goto out;
2421
2422         cfg.physAddr = dma_handle;
2423         cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
2424
2425         if (mpt_config(ioc, &cfg) != 0)
2426                 goto out;
2427
2428         if (!(buffer->VolumeStatus.Flags &
2429             MPI_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE))
2430                 goto out;
2431
2432         if (!buffer->NumPhysDisks)
2433                 goto out;
2434
2435         for (i = 0; i < buffer->NumPhysDisks; i++) {
2436
2437                 if (mpt_raid_phys_disk_pg0(ioc,
2438                     buffer->PhysDisk[i].PhysDiskNum, &phys_disk) != 0)
2439                         continue;
2440
2441                 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
2442                 if (!ev) {
2443                         printk(KERN_WARNING "mptsas: lost hotplug event\n");
2444                         goto out;
2445                 }
2446
2447                 INIT_WORK(&ev->work, mptsas_hotplug_work);
2448                 ev->ioc = ioc;
2449                 ev->id = phys_disk.PhysDiskID;
2450                 ev->channel = phys_disk.PhysDiskBus;
2451                 ev->phys_disk_num_valid = 1;
2452                 ev->phys_disk_num = phys_disk.PhysDiskNum;
2453                 ev->event_type = MPTSAS_ADD_DEVICE;
2454                 schedule_work(&ev->work);
2455         }
2456
2457  out:
2458         if (buffer)
2459                 pci_free_consistent(ioc->pcidev, hdr.PageLength * 4, buffer,
2460                     dma_handle);
2461 }
2462 /*
2463  * Work queue thread to handle SAS hotplug events
2464  */
2465 static void
2466 mptsas_hotplug_work(struct work_struct *work)
2467 {
2468         struct mptsas_hotplug_event *ev =
2469                 container_of(work, struct mptsas_hotplug_event, work);
2470
2471         MPT_ADAPTER *ioc = ev->ioc;
2472         struct mptsas_phyinfo *phy_info;
2473         struct sas_rphy *rphy;
2474         struct sas_port *port;
2475         struct scsi_device *sdev;
2476         struct scsi_target * starget;
2477         struct sas_identify identify;
2478         char *ds = NULL;
2479         struct mptsas_devinfo sas_device;
2480         VirtTarget *vtarget;
2481         VirtDevice *vdevice;
2482
2483         mutex_lock(&ioc->sas_discovery_mutex);
2484         switch (ev->event_type) {
2485         case MPTSAS_DEL_DEVICE:
2486
2487                 phy_info = NULL;
2488                 if (ev->phys_disk_num_valid) {
2489                         if (ev->hidden_raid_component){
2490                                 if (mptsas_sas_device_pg0(ioc, &sas_device,
2491                                     (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
2492                                      MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2493                                     (ev->channel << 8) + ev->id)) {
2494                                         dfailprintk((MYIOC_s_ERR_FMT
2495                                         "%s: exit at line=%d\n", ioc->name,
2496                                                 __FUNCTION__, __LINE__));
2497                                         break;
2498                                 }
2499                                 phy_info = mptsas_find_phyinfo_by_sas_address(
2500                                     ioc, sas_device.sas_address);
2501                         }else
2502                                 phy_info = mptsas_find_phyinfo_by_phys_disk_num(
2503                                     ioc, ev->channel, ev->phys_disk_num);
2504                 }
2505
2506                 if (!phy_info)
2507                         phy_info = mptsas_find_phyinfo_by_target(ioc,
2508                             ev->channel, ev->id);
2509
2510                 /*
2511                  * Sanity checks, for non-existing phys and remote rphys.
2512                  */
2513                 if (!phy_info){
2514                         dfailprintk((MYIOC_s_ERR_FMT
2515                                 "%s: exit at line=%d\n", ioc->name,
2516                                 __FUNCTION__, __LINE__));
2517                         break;
2518                 }
2519                 if (!phy_info->port_details) {
2520                         dfailprintk((MYIOC_s_ERR_FMT
2521                                 "%s: exit at line=%d\n", ioc->name,
2522                                 __FUNCTION__, __LINE__));
2523                         break;
2524                 }
2525                 rphy = mptsas_get_rphy(phy_info);
2526                 if (!rphy) {
2527                         dfailprintk((MYIOC_s_ERR_FMT
2528                                 "%s: exit at line=%d\n", ioc->name,
2529                                 __FUNCTION__, __LINE__));
2530                         break;
2531                 }
2532
2533                 port = mptsas_get_port(phy_info);
2534                 if (!port) {
2535                         dfailprintk((MYIOC_s_ERR_FMT
2536                                 "%s: exit at line=%d\n", ioc->name,
2537                                 __FUNCTION__, __LINE__));
2538                         break;
2539                 }
2540
2541                 starget = mptsas_get_starget(phy_info);
2542                 if (starget) {
2543                         vtarget = starget->hostdata;
2544
2545                         if (!vtarget) {
2546                                 dfailprintk((MYIOC_s_ERR_FMT
2547                                         "%s: exit at line=%d\n", ioc->name,
2548                                         __FUNCTION__, __LINE__));
2549                                 break;
2550                         }
2551
2552                         /*
2553                          * Handling  RAID components
2554                          */
2555                         if (ev->phys_disk_num_valid &&
2556                             ev->hidden_raid_component) {
2557                                 printk(MYIOC_s_INFO_FMT
2558                                     "RAID Hidding: channel=%d, id=%d, "
2559                                     "physdsk %d \n", ioc->name, ev->channel,
2560                                     ev->id, ev->phys_disk_num);
2561                                 vtarget->id = ev->phys_disk_num;
2562                                 vtarget->tflags |=
2563                                     MPT_TARGET_FLAGS_RAID_COMPONENT;
2564                                 mptsas_reprobe_target(starget, 1);
2565                                 phy_info->attached.phys_disk_num =
2566                                     ev->phys_disk_num;
2567                         break;
2568                         }
2569                 }
2570
2571                 if (phy_info->attached.device_info &
2572                     MPI_SAS_DEVICE_INFO_SSP_TARGET)
2573                         ds = "ssp";
2574                 if (phy_info->attached.device_info &
2575                     MPI_SAS_DEVICE_INFO_STP_TARGET)
2576                         ds = "stp";
2577                 if (phy_info->attached.device_info &
2578                     MPI_SAS_DEVICE_INFO_SATA_DEVICE)
2579                         ds = "sata";
2580
2581                 printk(MYIOC_s_INFO_FMT
2582                        "removing %s device, channel %d, id %d, phy %d\n",
2583                        ioc->name, ds, ev->channel, ev->id, phy_info->phy_id);
2584 #ifdef MPT_DEBUG_SAS_WIDE
2585                 dev_printk(KERN_DEBUG, &port->dev,
2586                     "delete port (%d)\n", port->port_identifier);
2587 #endif
2588                 sas_port_delete(port);
2589                 mptsas_port_delete(phy_info->port_details);
2590                 break;
2591         case MPTSAS_ADD_DEVICE:
2592
2593                 if (ev->phys_disk_num_valid)
2594                         mpt_findImVolumes(ioc);
2595
2596                 /*
2597                  * Refresh sas device pg0 data
2598                  */
2599                 if (mptsas_sas_device_pg0(ioc, &sas_device,
2600                     (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
2601                      MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
2602                         (ev->channel << 8) + ev->id)) {
2603                                 dfailprintk((MYIOC_s_ERR_FMT
2604                                         "%s: exit at line=%d\n", ioc->name,
2605                                         __FUNCTION__, __LINE__));
2606                         break;
2607                 }
2608
2609                 __mptsas_discovery_work(ioc);
2610
2611                 phy_info = mptsas_find_phyinfo_by_sas_address(ioc,
2612                                 sas_device.sas_address);
2613
2614                 if (!phy_info || !phy_info->port_details) {
2615                         dfailprintk((MYIOC_s_ERR_FMT
2616                                 "%s: exit at line=%d\n", ioc->name,
2617                                 __FUNCTION__, __LINE__));
2618                         break;
2619                 }
2620
2621                 starget = mptsas_get_starget(phy_info);
2622                 if (starget && (!ev->hidden_raid_component)){
2623
2624                         vtarget = starget->hostdata;
2625
2626                         if (!vtarget) {
2627                                 dfailprintk((MYIOC_s_ERR_FMT
2628                                         "%s: exit at line=%d\n", ioc->name,
2629                                         __FUNCTION__, __LINE__));
2630                                 break;
2631                         }
2632                         /*
2633                          * Handling  RAID components
2634                          */
2635                         if (vtarget->tflags & MPT_TARGET_FLAGS_RAID_COMPONENT) {
2636                                 printk(MYIOC_s_INFO_FMT
2637                                     "RAID Exposing: channel=%d, id=%d, "
2638                                     "physdsk %d \n", ioc->name, ev->channel,
2639                                     ev->id, ev->phys_disk_num);
2640                                 vtarget->tflags &=
2641                                     ~MPT_TARGET_FLAGS_RAID_COMPONENT;
2642                                 vtarget->id = ev->id;
2643                                 mptsas_reprobe_target(starget, 0);
2644                                 phy_info->attached.phys_disk_num = ~0;
2645                         }
2646                         break;
2647                 }
2648
2649                 if (mptsas_get_rphy(phy_info)) {
2650                         dfailprintk((MYIOC_s_ERR_FMT
2651                                 "%s: exit at line=%d\n", ioc->name,
2652                                 __FUNCTION__, __LINE__));
2653                         if (ev->channel) printk("%d\n", __LINE__);
2654                         break;
2655                 }
2656
2657                 port = mptsas_get_port(phy_info);
2658                 if (!port) {
2659                         dfailprintk((MYIOC_s_ERR_FMT
2660                                 "%s: exit at line=%d\n", ioc->name,
2661                                 __FUNCTION__, __LINE__));
2662                         break;
2663                 }
2664                 memcpy(&phy_info->attached, &sas_device,
2665                     sizeof(struct mptsas_devinfo));
2666
2667                 if (phy_info->attached.device_info &
2668                     MPI_SAS_DEVICE_INFO_SSP_TARGET)
2669                         ds = "ssp";
2670                 if (phy_info->attached.device_info &
2671                     MPI_SAS_DEVICE_INFO_STP_TARGET)
2672                         ds = "stp";
2673                 if (phy_info->attached.device_info &
2674                     MPI_SAS_DEVICE_INFO_SATA_DEVICE)
2675                         ds = "sata";
2676
2677                 printk(MYIOC_s_INFO_FMT
2678                        "attaching %s device, channel %d, id %d, phy %d\n",
2679                        ioc->name, ds, ev->channel, ev->id, ev->phy_id);
2680
2681                 mptsas_parse_device_info(&identify, &phy_info->attached);
2682                 rphy = sas_end_device_alloc(port);
2683                 if (!rphy) {
2684                         dfailprintk((MYIOC_s_ERR_FMT
2685                                 "%s: exit at line=%d\n", ioc->name,
2686                                 __FUNCTION__, __LINE__));
2687                         break; /* non-fatal: an rphy can be added later */
2688                 }
2689
2690                 rphy->identify = identify;
2691                 if (sas_rphy_add(rphy)) {
2692                         dfailprintk((MYIOC_s_ERR_FMT
2693                                 "%s: exit at line=%d\n", ioc->name,
2694                                 __FUNCTION__, __LINE__));
2695                         sas_rphy_free(rphy);
2696                         break;
2697                 }
2698                 mptsas_set_rphy(phy_info, rphy);
2699                 break;
2700         case MPTSAS_ADD_RAID:
2701                 sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL,
2702                     ev->id, 0);
2703                 if (sdev) {
2704                         scsi_device_put(sdev);
2705                         break;
2706                 }
2707                 printk(MYIOC_s_INFO_FMT
2708                        "attaching raid volume, channel %d, id %d\n",
2709                        ioc->name, MPTSAS_RAID_CHANNEL, ev->id);
2710                 scsi_add_device(ioc->sh, MPTSAS_RAID_CHANNEL, ev->id, 0);
2711                 mpt_findImVolumes(ioc);
2712                 break;
2713         case MPTSAS_DEL_RAID:
2714                 sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL,
2715                     ev->id, 0);
2716                 if (!sdev)
2717                         break;
2718                 printk(MYIOC_s_INFO_FMT
2719                        "removing raid volume, channel %d, id %d\n",
2720                        ioc->name, MPTSAS_RAID_CHANNEL, ev->id);
2721                 vdevice = sdev->hostdata;
2722                 scsi_remove_device(sdev);
2723                 scsi_device_put(sdev);
2724                 mpt_findImVolumes(ioc);
2725                 break;
2726         case MPTSAS_ADD_INACTIVE_VOLUME:
2727                 mptsas_adding_inactive_raid_components(ioc,
2728                     ev->channel, ev->id);
2729                 break;
2730         case MPTSAS_IGNORE_EVENT:
2731         default:
2732                 break;
2733         }
2734
2735         mutex_unlock(&ioc->sas_discovery_mutex);
2736         kfree(ev);
2737 }
2738
2739 static void
2740 mptsas_send_sas_event(MPT_ADAPTER *ioc,
2741                 EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data)
2742 {
2743         struct mptsas_hotplug_event *ev;
2744         u32 device_info = le32_to_cpu(sas_event_data->DeviceInfo);
2745         __le64 sas_address;
2746
2747         if ((device_info &
2748              (MPI_SAS_DEVICE_INFO_SSP_TARGET |
2749               MPI_SAS_DEVICE_INFO_STP_TARGET |
2750               MPI_SAS_DEVICE_INFO_SATA_DEVICE )) == 0)
2751                 return;
2752
2753         switch (sas_event_data->ReasonCode) {
2754         case MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING:
2755
2756                 mptsas_target_reset_queue(ioc, sas_event_data);
2757                 break;
2758
2759         case MPI_EVENT_SAS_DEV_STAT_RC_ADDED:
2760                 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
2761                 if (!ev) {
2762                         printk(KERN_WARNING "mptsas: lost hotplug event\n");
2763                         break;
2764                 }
2765
2766                 INIT_WORK(&ev->work, mptsas_hotplug_work);
2767                 ev->ioc = ioc;
2768                 ev->handle = le16_to_cpu(sas_event_data->DevHandle);
2769                 ev->parent_handle =
2770                     le16_to_cpu(sas_event_data->ParentDevHandle);
2771                 ev->channel = sas_event_data->Bus;
2772                 ev->id = sas_event_data->TargetID;
2773                 ev->phy_id = sas_event_data->PhyNum;
2774                 memcpy(&sas_address, &sas_event_data->SASAddress,
2775                     sizeof(__le64));
2776                 ev->sas_address = le64_to_cpu(sas_address);
2777                 ev->device_info = device_info;
2778
2779                 if (sas_event_data->ReasonCode &
2780                     MPI_EVENT_SAS_DEV_STAT_RC_ADDED)
2781                         ev->event_type = MPTSAS_ADD_DEVICE;
2782                 else
2783                         ev->event_type = MPTSAS_DEL_DEVICE;
2784                 schedule_work(&ev->work);
2785                 break;
2786         case MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED:
2787         /*
2788          * Persistent table is full.
2789          */
2790                 INIT_WORK(&ioc->sas_persist_task,
2791                     mptsas_persist_clear_table);
2792                 schedule_work(&ioc->sas_persist_task);
2793                 break;
2794         /*
2795          * TODO, handle other events
2796          */
2797         case MPI_EVENT_SAS_DEV_STAT_RC_SMART_DATA:
2798         case MPI_EVENT_SAS_DEV_STAT_RC_UNSUPPORTED:
2799         case MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET:
2800         case MPI_EVENT_SAS_DEV_STAT_RC_TASK_ABORT_INTERNAL:
2801         case MPI_EVENT_SAS_DEV_STAT_RC_ABORT_TASK_SET_INTERNAL:
2802         case MPI_EVENT_SAS_DEV_STAT_RC_CLEAR_TASK_SET_INTERNAL:
2803         case MPI_EVENT_SAS_DEV_STAT_RC_QUERY_TASK_INTERNAL:
2804         default:
2805                 break;
2806         }
2807 }
2808 static void
2809 mptsas_send_raid_event(MPT_ADAPTER *ioc,
2810                 EVENT_DATA_RAID *raid_event_data)
2811 {
2812         struct mptsas_hotplug_event *ev;
2813         int status = le32_to_cpu(raid_event_data->SettingsStatus);
2814         int state = (status >> 8) & 0xff;
2815
2816         if (ioc->bus_type != SAS)
2817                 return;
2818
2819         ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
2820         if (!ev) {
2821                 printk(KERN_WARNING "mptsas: lost hotplug event\n");
2822                 return;
2823         }
2824
2825         INIT_WORK(&ev->work, mptsas_hotplug_work);
2826         ev->ioc = ioc;
2827         ev->id = raid_event_data->VolumeID;
2828         ev->channel = raid_event_data->VolumeBus;
2829         ev->event_type = MPTSAS_IGNORE_EVENT;
2830
2831         switch (raid_event_data->ReasonCode) {
2832         case MPI_EVENT_RAID_RC_PHYSDISK_DELETED:
2833                 ev->phys_disk_num_valid = 1;
2834                 ev->phys_disk_num = raid_event_data->PhysDiskNum;
2835                 ev->event_type = MPTSAS_ADD_DEVICE;
2836                 break;
2837         case MPI_EVENT_RAID_RC_PHYSDISK_CREATED:
2838                 ev->phys_disk_num_valid = 1;
2839                 ev->phys_disk_num = raid_event_data->PhysDiskNum;
2840                 ev->hidden_raid_component = 1;
2841                 ev->event_type = MPTSAS_DEL_DEVICE;
2842                 break;
2843         case MPI_EVENT_RAID_RC_PHYSDISK_STATUS_CHANGED:
2844                 switch (state) {
2845                 case MPI_PD_STATE_ONLINE:
2846                 case MPI_PD_STATE_NOT_COMPATIBLE:
2847                         ev->phys_disk_num_valid = 1;
2848                         ev->phys_disk_num = raid_event_data->PhysDiskNum;
2849                         ev->hidden_raid_component = 1;
2850                         ev->event_type = MPTSAS_ADD_DEVICE;
2851                         break;
2852                 case MPI_PD_STATE_MISSING:
2853                 case MPI_PD_STATE_OFFLINE_AT_HOST_REQUEST:
2854                 case MPI_PD_STATE_FAILED_AT_HOST_REQUEST:
2855                 case MPI_PD_STATE_OFFLINE_FOR_ANOTHER_REASON:
2856                         ev->phys_disk_num_valid = 1;
2857                         ev->phys_disk_num = raid_event_data->PhysDiskNum;
2858                         ev->event_type = MPTSAS_DEL_DEVICE;
2859                         break;
2860                 default:
2861                         break;
2862                 }
2863                 break;
2864         case MPI_EVENT_RAID_RC_VOLUME_DELETED:
2865                 ev->event_type = MPTSAS_DEL_RAID;
2866                 break;
2867         case MPI_EVENT_RAID_RC_VOLUME_CREATED:
2868                 ev->event_type = MPTSAS_ADD_RAID;
2869                 break;
2870         case MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED:
2871                 switch (state) {
2872                 case MPI_RAIDVOL0_STATUS_STATE_FAILED:
2873                 case MPI_RAIDVOL0_STATUS_STATE_MISSING:
2874                         ev->event_type = MPTSAS_DEL_RAID;
2875                         break;
2876                 case MPI_RAIDVOL0_STATUS_STATE_OPTIMAL:
2877                 case MPI_RAIDVOL0_STATUS_STATE_DEGRADED:
2878                         ev->event_type = MPTSAS_ADD_RAID;
2879                         break;
2880                 default:
2881                         break;
2882                 }
2883                 break;
2884         default:
2885                 break;
2886         }
2887         schedule_work(&ev->work);
2888 }
2889
2890 static void
2891 mptsas_send_discovery_event(MPT_ADAPTER *ioc,
2892         EVENT_DATA_SAS_DISCOVERY *discovery_data)
2893 {
2894         struct mptsas_discovery_event *ev;
2895
2896         /*
2897          * DiscoveryStatus
2898          *
2899          * This flag will be non-zero when firmware
2900          * kicks off discovery, and return to zero
2901          * once its completed.
2902          */
2903         if (discovery_data->DiscoveryStatus)
2904                 return;
2905
2906         ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
2907         if (!ev)
2908                 return;
2909         INIT_WORK(&ev->work, mptsas_discovery_work);
2910         ev->ioc = ioc;
2911         schedule_work(&ev->work);
2912 };
2913
2914 /*
2915  * mptsas_send_ir2_event - handle exposing hidden disk when
2916  * an inactive raid volume is added
2917  *
2918  * @ioc: Pointer to MPT_ADAPTER structure
2919  * @ir2_data
2920  *
2921  */
2922 static void
2923 mptsas_send_ir2_event(MPT_ADAPTER *ioc, PTR_MPI_EVENT_DATA_IR2 ir2_data)
2924 {
2925         struct mptsas_hotplug_event *ev;
2926
2927         if (ir2_data->ReasonCode !=
2928             MPI_EVENT_IR2_RC_FOREIGN_CFG_DETECTED)
2929                 return;
2930
2931         ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
2932         if (!ev)
2933                 return;
2934
2935         INIT_WORK(&ev->work, mptsas_hotplug_work);
2936         ev->ioc = ioc;
2937         ev->id = ir2_data->TargetID;
2938         ev->channel = ir2_data->Bus;
2939         ev->event_type = MPTSAS_ADD_INACTIVE_VOLUME;
2940
2941         schedule_work(&ev->work);
2942 };
2943
2944 static int
2945 mptsas_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *reply)
2946 {
2947         int rc=1;
2948         u8 event = le32_to_cpu(reply->Event) & 0xFF;
2949
2950         if (!ioc->sh)
2951                 goto out;
2952
2953         /*
2954          * sas_discovery_ignore_events
2955          *
2956          * This flag is to prevent anymore processing of
2957          * sas events once mptsas_remove function is called.
2958          */
2959         if (ioc->sas_discovery_ignore_events) {
2960                 rc = mptscsih_event_process(ioc, reply);
2961                 goto out;
2962         }
2963
2964         switch (event) {
2965         case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE:
2966                 mptsas_send_sas_event(ioc,
2967                         (EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *)reply->Data);
2968                 break;
2969         case MPI_EVENT_INTEGRATED_RAID:
2970                 mptsas_send_raid_event(ioc,
2971                         (EVENT_DATA_RAID *)reply->Data);
2972                 break;
2973         case MPI_EVENT_PERSISTENT_TABLE_FULL:
2974                 INIT_WORK(&ioc->sas_persist_task,
2975                     mptsas_persist_clear_table);
2976                 schedule_work(&ioc->sas_persist_task);
2977                 break;
2978          case MPI_EVENT_SAS_DISCOVERY:
2979                 mptsas_send_discovery_event(ioc,
2980                         (EVENT_DATA_SAS_DISCOVERY *)reply->Data);
2981                 break;
2982         case MPI_EVENT_IR2:
2983                 mptsas_send_ir2_event(ioc,
2984                     (PTR_MPI_EVENT_DATA_IR2)reply->Data);
2985                 break;
2986         default:
2987                 rc = mptscsih_event_process(ioc, reply);
2988                 break;
2989         }
2990  out:
2991
2992         return rc;
2993 }
2994
2995 static int
2996 mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
2997 {
2998         struct Scsi_Host        *sh;
2999         MPT_SCSI_HOST           *hd;
3000         MPT_ADAPTER             *ioc;
3001         unsigned long            flags;
3002         int                      ii;
3003         int                      numSGE = 0;
3004         int                      scale;
3005         int                      ioc_cap;
3006         int                     error=0;
3007         int                     r;
3008
3009         r = mpt_attach(pdev,id);
3010         if (r)
3011                 return r;
3012
3013         ioc = pci_get_drvdata(pdev);
3014         ioc->DoneCtx = mptsasDoneCtx;
3015         ioc->TaskCtx = mptsasTaskCtx;
3016         ioc->InternalCtx = mptsasInternalCtx;
3017
3018         /*  Added sanity check on readiness of the MPT adapter.
3019          */
3020         if (ioc->last_state != MPI_IOC_STATE_OPERATIONAL) {
3021                 printk(MYIOC_s_WARN_FMT
3022                   "Skipping because it's not operational!\n",
3023                   ioc->name);
3024                 error = -ENODEV;
3025                 goto out_mptsas_probe;
3026         }
3027
3028         if (!ioc->active) {
3029                 printk(MYIOC_s_WARN_FMT "Skipping because it's disabled!\n",
3030                   ioc->name);
3031                 error = -ENODEV;
3032                 goto out_mptsas_probe;
3033         }
3034
3035         /*  Sanity check - ensure at least 1 port is INITIATOR capable
3036          */
3037         ioc_cap = 0;
3038         for (ii = 0; ii < ioc->facts.NumberOfPorts; ii++) {
3039                 if (ioc->pfacts[ii].ProtocolFlags &
3040                                 MPI_PORTFACTS_PROTOCOL_INITIATOR)
3041                         ioc_cap++;
3042         }
3043
3044         if (!ioc_cap) {
3045                 printk(MYIOC_s_WARN_FMT
3046                         "Skipping ioc=%p because SCSI Initiator mode "
3047                         "is NOT enabled!\n", ioc->name, ioc);
3048                 return 0;
3049         }
3050
3051         sh = scsi_host_alloc(&mptsas_driver_template, sizeof(MPT_SCSI_HOST));
3052         if (!sh) {
3053                 printk(MYIOC_s_WARN_FMT
3054                         "Unable to register controller with SCSI subsystem\n",
3055                         ioc->name);
3056                 error = -1;
3057                 goto out_mptsas_probe;
3058         }
3059
3060         spin_lock_irqsave(&ioc->FreeQlock, flags);
3061
3062         /* Attach the SCSI Host to the IOC structure
3063          */
3064         ioc->sh = sh;
3065
3066         sh->io_port = 0;
3067         sh->n_io_port = 0;
3068         sh->irq = 0;
3069
3070         /* set 16 byte cdb's */
3071         sh->max_cmd_len = 16;
3072
3073         sh->max_id = ioc->pfacts[0].PortSCSIID;
3074         sh->max_lun = max_lun;
3075
3076         sh->transportt = mptsas_transport_template;
3077
3078         sh->this_id = ioc->pfacts[0].PortSCSIID;
3079
3080         /* Required entry.
3081          */
3082         sh->unique_id = ioc->id;
3083
3084         INIT_LIST_HEAD(&ioc->sas_topology);
3085         mutex_init(&ioc->sas_topology_mutex);
3086         mutex_init(&ioc->sas_discovery_mutex);
3087         mutex_init(&ioc->sas_mgmt.mutex);
3088         init_completion(&ioc->sas_mgmt.done);
3089
3090         /* Verify that we won't exceed the maximum
3091          * number of chain buffers
3092          * We can optimize:  ZZ = req_sz/sizeof(SGE)
3093          * For 32bit SGE's:
3094          *  numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ
3095          *               + (req_sz - 64)/sizeof(SGE)
3096          * A slightly different algorithm is required for
3097          * 64bit SGEs.
3098          */
3099         scale = ioc->req_sz/(sizeof(dma_addr_t) + sizeof(u32));
3100         if (sizeof(dma_addr_t) == sizeof(u64)) {
3101                 numSGE = (scale - 1) *
3102                   (ioc->facts.MaxChainDepth-1) + scale +
3103                   (ioc->req_sz - 60) / (sizeof(dma_addr_t) +
3104                   sizeof(u32));
3105         } else {
3106                 numSGE = 1 + (scale - 1) *
3107                   (ioc->facts.MaxChainDepth-1) + scale +
3108                   (ioc->req_sz - 64) / (sizeof(dma_addr_t) +
3109                   sizeof(u32));
3110         }
3111
3112         if (numSGE < sh->sg_tablesize) {
3113                 /* Reset this value */
3114                 dprintk((MYIOC_s_INFO_FMT
3115                   "Resetting sg_tablesize to %d from %d\n",
3116                   ioc->name, numSGE, sh->sg_tablesize));
3117                 sh->sg_tablesize = numSGE;
3118         }
3119
3120         hd = (MPT_SCSI_HOST *) sh->hostdata;
3121         hd->ioc = ioc;
3122
3123         /* SCSI needs scsi_cmnd lookup table!
3124          * (with size equal to req_depth*PtrSz!)
3125          */
3126         hd->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC);
3127         if (!hd->ScsiLookup) {
3128                 error = -ENOMEM;
3129                 goto out_mptsas_probe;
3130         }
3131
3132         dprintk((MYIOC_s_INFO_FMT "ScsiLookup @ %p\n",
3133                  ioc->name, hd->ScsiLookup));
3134
3135         /* Clear the TM flags
3136          */
3137         hd->tmPending = 0;
3138         hd->tmState = TM_STATE_NONE;
3139         hd->resetPending = 0;
3140         hd->abortSCpnt = NULL;
3141
3142         /* Clear the pointer used to store
3143          * single-threaded commands, i.e., those
3144          * issued during a bus scan, dv and
3145          * configuration pages.
3146          */
3147         hd->cmdPtr = NULL;
3148
3149         /* Initialize this SCSI Hosts' timers
3150          * To use, set the timer expires field
3151          * and add_timer
3152          */
3153         init_timer(&hd->timer);
3154         hd->timer.data = (unsigned long) hd;
3155         hd->timer.function = mptscsih_timer_expired;
3156
3157         ioc->sas_data.ptClear = mpt_pt_clear;
3158
3159         init_waitqueue_head(&hd->scandv_waitq);
3160         hd->scandv_wait_done = 0;
3161         hd->last_queue_full = 0;
3162         INIT_LIST_HEAD(&hd->target_reset_list);
3163         spin_unlock_irqrestore(&ioc->FreeQlock, flags);
3164
3165         if (ioc->sas_data.ptClear==1) {
3166                 mptbase_sas_persist_operation(
3167                     ioc, MPI_SAS_OP_CLEAR_ALL_PERSISTENT);
3168         }
3169
3170         error = scsi_add_host(sh, &ioc->pcidev->dev);
3171         if (error) {
3172                 dprintk((KERN_ERR MYNAM
3173                   "scsi_add_host failed\n"));
3174                 goto out_mptsas_probe;
3175         }
3176
3177         mptsas_scan_sas_topology(ioc);
3178
3179         return 0;
3180
3181  out_mptsas_probe:
3182
3183         mptscsih_remove(pdev);
3184         return error;
3185 }
3186
3187 static void __devexit mptsas_remove(struct pci_dev *pdev)
3188 {
3189         MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
3190         struct mptsas_portinfo *p, *n;
3191         int i;
3192
3193         ioc->sas_discovery_ignore_events = 1;
3194         sas_remove_host(ioc->sh);
3195
3196         mutex_lock(&ioc->sas_topology_mutex);
3197         list_for_each_entry_safe(p, n, &ioc->sas_topology, list) {
3198                 list_del(&p->list);
3199                 for (i = 0 ; i < p->num_phys ; i++)
3200                         mptsas_port_delete(p->phy_info[i].port_details);
3201                 kfree(p->phy_info);
3202                 kfree(p);
3203         }
3204         mutex_unlock(&ioc->sas_topology_mutex);
3205
3206         mptscsih_remove(pdev);
3207 }
3208
3209 static struct pci_device_id mptsas_pci_table[] = {
3210         { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1064,
3211                 PCI_ANY_ID, PCI_ANY_ID },
3212         { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1068,
3213                 PCI_ANY_ID, PCI_ANY_ID },
3214         { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1064E,
3215                 PCI_ANY_ID, PCI_ANY_ID },
3216         { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1068E,
3217                 PCI_ANY_ID, PCI_ANY_ID },
3218         { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1078,
3219                 PCI_ANY_ID, PCI_ANY_ID },
3220         {0}     /* Terminating entry */
3221 };
3222 MODULE_DEVICE_TABLE(pci, mptsas_pci_table);
3223
3224
3225 static struct pci_driver mptsas_driver = {
3226         .name           = "mptsas",
3227         .id_table       = mptsas_pci_table,
3228         .probe          = mptsas_probe,
3229         .remove         = __devexit_p(mptsas_remove),
3230         .shutdown       = mptscsih_shutdown,
3231 #ifdef CONFIG_PM
3232         .suspend        = mptscsih_suspend,
3233         .resume         = mptscsih_resume,
3234 #endif
3235 };
3236
3237 static int __init
3238 mptsas_init(void)
3239 {
3240         show_mptmod_ver(my_NAME, my_VERSION);
3241
3242         mptsas_transport_template =
3243             sas_attach_transport(&mptsas_transport_functions);
3244         if (!mptsas_transport_template)
3245                 return -ENODEV;
3246
3247         mptsasDoneCtx = mpt_register(mptscsih_io_done, MPTSAS_DRIVER);
3248         mptsasTaskCtx = mpt_register(mptsas_taskmgmt_complete, MPTSAS_DRIVER);
3249         mptsasInternalCtx =
3250                 mpt_register(mptscsih_scandv_complete, MPTSAS_DRIVER);
3251         mptsasMgmtCtx = mpt_register(mptsas_mgmt_done, MPTSAS_DRIVER);
3252
3253         if (mpt_event_register(mptsasDoneCtx, mptsas_event_process) == 0) {
3254                 devtverboseprintk((KERN_INFO MYNAM
3255                   ": Registered for IOC event notifications\n"));
3256         }
3257
3258         if (mpt_reset_register(mptsasDoneCtx, mptsas_ioc_reset) == 0) {
3259                 dprintk((KERN_INFO MYNAM
3260                   ": Registered for IOC reset notifications\n"));
3261         }
3262
3263         return pci_register_driver(&mptsas_driver);
3264 }
3265
3266 static void __exit
3267 mptsas_exit(void)
3268 {
3269         pci_unregister_driver(&mptsas_driver);
3270         sas_release_transport(mptsas_transport_template);
3271
3272         mpt_reset_deregister(mptsasDoneCtx);
3273         mpt_event_deregister(mptsasDoneCtx);
3274
3275         mpt_deregister(mptsasMgmtCtx);
3276         mpt_deregister(mptsasInternalCtx);
3277         mpt_deregister(mptsasTaskCtx);
3278         mpt_deregister(mptsasDoneCtx);
3279 }
3280
3281 module_init(mptsas_init);
3282 module_exit(mptsas_exit);