aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/mpt2sas/mpt2sas_module.c
diff options
context:
space:
mode:
authorSreekanth Reddy <sreekanth.reddy@avagotech.com>2015-11-11 07:00:35 -0500
committerMartin K. Petersen <martin.petersen@oracle.com>2015-11-11 19:50:11 -0500
commitc84b06a48c4d8ac8270624453132f3fa1a4a0f9d (patch)
tree9f6a8af42a578cfe74bff8e65dfb5861a585d47b /drivers/scsi/mpt2sas/mpt2sas_module.c
parentd0c627afb7a6753488b9e8948b307941880b1b9e (diff)
mpt3sas: Single driver module which supports both SAS 2.0 & SAS 3.0 HBAs
Modified the mpt3sas driver to have a single driver module which supports both SAS 2.0 & SAS 3.0 HBA devices. * Added SAS 2.0 HBA device IDs to the mpt3sas_pci_table pci table. * Created two separate SCSI host templates for SAS2 and SAS3 HBAs so that, during the driver load time driver can use corresponding host template(based the pci device ID) while registering a scsi host adapter instance for that pci device. * Registered two IOCTL devices, mpt2ctl is for SAS2 HBAs & mpt3ctl for SAS3 HBAs. Also updated the code to make sure that mpt2ctl device processes only those ioctl cmds issued for the SAS2 HBAs and mpt3ctl device processes only those ioctl cmds issued for the SAS3 HBAs. * Added separate indexing for SAS2 and SAS3 HBAs. * Replaced compile time check 'MPT2SAS_SCSI' to run time check 'hba_mpi_version_belonged' whereever needed. * Aliased this merged driver to mpt2sas using MODULE_ALIAS. * Moved global varaible 'driver_name' to per adapter instance variable. * Created two raid function template and used corresponding raid function templates based on the run time check 'hba_mpi_version_belonged'. * Moved mpt2sas_warpdrive.c file from mpt2sas to mpt3sas folder and renamed it as mpt3sas_warpdrive.c. * Also renamed the functions in mpt3sas_warpdrive.c file to follow current driver function name convention. * Updated the Makefile to build mpt3sas_warpdrive.o file for these WarpDrive-specific functions. * Also in function mpt3sas_setup_direct_io(), used sector_div() API instead of division operator (which gives compilation errors on 32 bit machines). * Removed mpt2sas files, mpt2sas directory & mpt3sas_module.c file. * Added module parameter 'hbas_to_enumerate' which permits using this merged driver as a legacy mpt2sas driver or as a legacy mpt3sas driver. Here are the available options for this module parameter: 0 - Merged driver which enumerates both SAS 2.0 & SAS 3.0 HBAs 1 - Acts as legacy mpt2sas driver, which enumerates only SAS 2.0 HBAs 2 - Acts as legacy mpt3sas driver, which enumerates only SAS 3.0 HBAs * Removed mpt2sas entries from SCSI's Kconfig and Makefile files. Signed-off-by: Sreekanth Reddy <Sreekanth.Reddy@avagotech.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi/mpt2sas/mpt2sas_module.c')
-rw-r--r--drivers/scsi/mpt2sas/mpt2sas_module.c281
1 files changed, 0 insertions, 281 deletions
diff --git a/drivers/scsi/mpt2sas/mpt2sas_module.c b/drivers/scsi/mpt2sas/mpt2sas_module.c
deleted file mode 100644
index d407ed04315d..000000000000
--- a/drivers/scsi/mpt2sas/mpt2sas_module.c
+++ /dev/null
@@ -1,281 +0,0 @@
1/*
2 * Scsi Host Layer for MPT (Message Passing Technology) based controllers
3 *
4 * Copyright (C) 2012-2014 LSI Corporation
5 * Copyright (C) 2013-2015 Avago Technologies
6 * (mailto: MPT-FusionLinux.pdl@avagotech.com)
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * NO WARRANTY
19 * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
20 * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
21 * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
22 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
23 * solely responsible for determining the appropriateness of using and
24 * distributing the Program and assumes all risks associated with its
25 * exercise of rights under this Agreement, including but not limited to
26 * the risks and costs of program errors, damage to or loss of data,
27 * programs or equipment, and unavailability or interruption of operations.
28
29 * DISCLAIMER OF LIABILITY
30 * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
31 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32 * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
33 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
34 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
35 * USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
36 * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
37
38 * You should have received a copy of the GNU General Public License
39 * along with this program.
40 */
41
42#include <linux/module.h>
43#include <linux/pci.h>
44#include <linux/raid_class.h>
45
46#include "mpt3sas_base.h"
47#include "mpt3sas_ctl.h"
48
49MODULE_AUTHOR(MPT3SAS_AUTHOR);
50MODULE_DESCRIPTION(MPT2SAS_DESCRIPTION);
51MODULE_LICENSE("GPL");
52MODULE_VERSION(MPT2SAS_DRIVER_VERSION);
53
54/* shost template */
55static struct scsi_host_template mpt2sas_driver_template = {
56 .module = THIS_MODULE,
57 .name = "Fusion MPT SAS Host",
58 .proc_name = MPT2SAS_DRIVER_NAME,
59 .queuecommand = scsih_qcmd,
60 .target_alloc = scsih_target_alloc,
61 .slave_alloc = scsih_slave_alloc,
62 .slave_configure = scsih_slave_configure,
63 .target_destroy = scsih_target_destroy,
64 .slave_destroy = scsih_slave_destroy,
65 .scan_finished = scsih_scan_finished,
66 .scan_start = scsih_scan_start,
67 .change_queue_depth = scsih_change_queue_depth,
68 .eh_abort_handler = scsih_abort,
69 .eh_device_reset_handler = scsih_dev_reset,
70 .eh_target_reset_handler = scsih_target_reset,
71 .eh_host_reset_handler = scsih_host_reset,
72 .bios_param = scsih_bios_param,
73 .can_queue = 1,
74 .this_id = -1,
75 .sg_tablesize = MPT2SAS_SG_DEPTH,
76 .max_sectors = 32767,
77 .cmd_per_lun = 7,
78 .use_clustering = ENABLE_CLUSTERING,
79 .shost_attrs = mpt3sas_host_attrs,
80 .sdev_attrs = mpt3sas_dev_attrs,
81 .track_queue_depth = 1,
82};
83
84/* raid transport support */
85static struct raid_function_template mpt2sas_raid_functions = {
86 .cookie = &mpt2sas_driver_template,
87 .is_raid = scsih_is_raid,
88 .get_resync = scsih_get_resync,
89 .get_state = scsih_get_state,
90};
91
92/*
93 * The pci device ids are defined in mpi/mpi2_cnfg.h.
94 */
95static const struct pci_device_id mpt2sas_pci_table[] = {
96 { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2004,
97 PCI_ANY_ID, PCI_ANY_ID },
98 /* Falcon ~ 2008*/
99 { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2008,
100 PCI_ANY_ID, PCI_ANY_ID },
101 /* Liberator ~ 2108 */
102 { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2108_1,
103 PCI_ANY_ID, PCI_ANY_ID },
104 { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2108_2,
105 PCI_ANY_ID, PCI_ANY_ID },
106 { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2108_3,
107 PCI_ANY_ID, PCI_ANY_ID },
108 /* Meteor ~ 2116 */
109 { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2116_1,
110 PCI_ANY_ID, PCI_ANY_ID },
111 { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2116_2,
112 PCI_ANY_ID, PCI_ANY_ID },
113 /* Thunderbolt ~ 2208 */
114 { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2208_1,
115 PCI_ANY_ID, PCI_ANY_ID },
116 { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2208_2,
117 PCI_ANY_ID, PCI_ANY_ID },
118 { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2208_3,
119 PCI_ANY_ID, PCI_ANY_ID },
120 { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2208_4,
121 PCI_ANY_ID, PCI_ANY_ID },
122 { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2208_5,
123 PCI_ANY_ID, PCI_ANY_ID },
124 { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2208_6,
125 PCI_ANY_ID, PCI_ANY_ID },
126 /* Mustang ~ 2308 */
127 { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2308_1,
128 PCI_ANY_ID, PCI_ANY_ID },
129 { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2308_2,
130 PCI_ANY_ID, PCI_ANY_ID },
131 { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SAS2308_3,
132 PCI_ANY_ID, PCI_ANY_ID },
133 /* SSS6200 */
134 { MPI2_MFGPAGE_VENDORID_LSI, MPI2_MFGPAGE_DEVID_SSS6200,
135 PCI_ANY_ID, PCI_ANY_ID },
136 {0} /* Terminating entry */
137};
138MODULE_DEVICE_TABLE(pci, mpt2sas_pci_table);
139
140static const struct file_operations mpt2sas_ctl_fops = {
141 .owner = THIS_MODULE,
142 .unlocked_ioctl = ctl_ioctl,
143 .poll = ctl_poll,
144 .fasync = ctl_fasync,
145#ifdef CONFIG_COMPAT
146 .compat_ioctl = ctl_ioctl_compat,
147#endif
148 .llseek = noop_llseek,
149};
150
151static struct miscdevice mpt2sas_ctl_dev = {
152 .minor = MPT2SAS_MINOR,
153 .name = MPT2SAS_DEV_NAME,
154 .fops = &mpt2sas_ctl_fops,
155};
156
157/**
158 * mpt2sas_ctl_init - main entry point for ctl.
159 *
160 */
161void
162mpt2sas_ctl_init(void)
163{
164 ctl_init();
165 if (misc_register(&mpt2sas_ctl_dev) < 0)
166 pr_err("%s can't register misc device [minor=%d]\n",
167 MPT2SAS_DRIVER_NAME, MPT2SAS_MINOR);
168}
169
170/**
171 * mpt2sas_ctl_exit - exit point for ctl
172 *
173 */
174void
175mpt2sas_ctl_exit(void)
176{
177 ctl_exit();
178 misc_deregister(&mpt2sas_ctl_dev);
179}
180
181/**
182 * _mpt2sas_probe - attach and add scsi host
183 * @pdev: PCI device struct
184 * @id: pci device id
185 *
186 * Returns 0 success, anything else error.
187 */
188static int
189_mpt2sas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
190{
191 struct Scsi_Host *shost;
192 int rv;
193
194 shost = scsi_host_alloc(&mpt2sas_driver_template,
195 sizeof(struct MPT3SAS_ADAPTER));
196 if (!shost)
197 return -ENODEV;
198
199 sprintf(driver_name, "%s", MPT2SAS_DRIVER_NAME);
200 rv = scsih_probe(pdev, shost);
201 return rv;
202}
203
204static struct pci_error_handlers _mpt2sas_err_handler = {
205 .error_detected = scsih_pci_error_detected,
206 .mmio_enabled = scsih_pci_mmio_enabled,
207 .slot_reset = scsih_pci_slot_reset,
208 .resume = scsih_pci_resume,
209};
210
211static struct pci_driver mpt2sas_driver = {
212 .name = MPT2SAS_DRIVER_NAME,
213 .id_table = mpt2sas_pci_table,
214 .probe = _mpt2sas_probe,
215 .remove = scsih_remove,
216 .shutdown = scsih_shutdown,
217 .err_handler = &_mpt2sas_err_handler,
218#ifdef CONFIG_PM
219 .suspend = scsih_suspend,
220 .resume = scsih_resume,
221#endif
222};
223
224/**
225 * _mpt2sas_init - main entry point for this driver.
226 *
227 * Returns 0 success, anything else error.
228 */
229static int __init
230_mpt2sas_init(void)
231{
232 int error;
233
234 pr_info("%s version %s loaded\n", MPT2SAS_DRIVER_NAME,
235 MPT2SAS_DRIVER_VERSION);
236
237 mpt3sas_transport_template =
238 sas_attach_transport(&mpt3sas_transport_functions);
239 if (!mpt3sas_transport_template)
240 return -ENODEV;
241
242 mpt3sas_raid_template = raid_class_attach(&mpt2sas_raid_functions);
243 if (!mpt3sas_raid_template) {
244 sas_release_transport(mpt3sas_transport_template);
245 return -ENODEV;
246 }
247
248 error = scsih_init();
249 if (error) {
250 scsih_exit();
251 return error;
252 }
253
254 mpt2sas_ctl_init();
255
256 error = pci_register_driver(&mpt2sas_driver);
257 if (error)
258 scsih_exit();
259
260 return error;
261}
262
263/**
264 * _mpt2sas_exit - exit point for this driver (when it is a module).
265 *
266 */
267static void __exit
268_mpt2sas_exit(void)
269{
270 pr_info("mpt2sas version %s unloading\n",
271 MPT2SAS_DRIVER_VERSION);
272
273 pci_unregister_driver(&mpt2sas_driver);
274
275 mpt2sas_ctl_exit();
276
277 scsih_exit();
278}
279
280module_init(_mpt2sas_init);
281module_exit(_mpt2sas_exit);