Skip to content

Commit 7497392

Browse files
Sreekanth Reddymartinkpetersen
authored andcommitted
mpt3sas: Move Gen3 HBA's device registration to a separate file
Created a mpt3sas_module.c file for mpt3sas driver where it can register SAS3 HBA devices with PCI, SML, IOCTL subsystems. Also removed the corresponding interfaces from mpt3sas_scsih.c file. Signed-off-by: Sreekanth Reddy <[email protected]> Acked-by: Christoph Hellwig <[email protected]> Reviewed-by: Hannes Reinecke <[email protected]> Signed-off-by: Martin K. Petersen <[email protected]>
1 parent 8a7e4c2 commit 7497392

File tree

5 files changed

+261
-159
lines changed

5 files changed

+261
-159
lines changed

drivers/scsi/mpt3sas/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ mpt3sas-y += mpt3sas_base.o \
55
mpt3sas_scsih.o \
66
mpt3sas_transport.o \
77
mpt3sas_ctl.o \
8-
mpt3sas_trigger_diag.o
8+
mpt3sas_trigger_diag.o \
9+
mpt3sas_module.o

drivers/scsi/mpt3sas/mpt3sas_base.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1084,6 +1084,7 @@ int mpt3sas_port_enable(struct MPT3SAS_ADAPTER *ioc);
10841084

10851085

10861086
/* scsih shared API */
1087+
extern struct raid_template *mpt3sas_raid_template;
10871088
u8 mpt3sas_scsih_event_callback(struct MPT3SAS_ADAPTER *ioc, u8 msix_index,
10881089
u32 reply);
10891090
void mpt3sas_scsih_reset_handler(struct MPT3SAS_ADAPTER *ioc, int reset_phase);
@@ -1108,7 +1109,7 @@ void mpt3sas_port_enable_complete(struct MPT3SAS_ADAPTER *ioc);
11081109

11091110
void scsih_exit(void);
11101111
int scsih_init(void);
1111-
int scsih_probe(struct pci_dev *pdev, const struct pci_device_id *id);
1112+
int scsih_probe(struct pci_dev *pdev, struct Scsi_Host *shost);
11121113
void scsih_remove(struct pci_dev *pdev);
11131114
void scsih_shutdown(struct pci_dev *pdev);
11141115
pci_ers_result_t scsih_pci_error_detected(struct pci_dev *pdev,
@@ -1241,6 +1242,7 @@ int mpt3sas_send_diag_release(struct MPT3SAS_ADAPTER *ioc, u8 buffer_type,
12411242
u8 *issue_reset);
12421243

12431244
/* transport shared API */
1245+
extern struct scsi_transport_template *mpt3sas_transport_template;
12441246
u8 mpt3sas_transport_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
12451247
u32 reply);
12461248
struct _sas_port *mpt3sas_transport_port_add(struct MPT3SAS_ADAPTER *ioc,

drivers/scsi/mpt3sas/mpt3sas_ctl.c

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3218,22 +3218,6 @@ struct device_attribute *mpt3sas_dev_attrs[] = {
32183218
NULL,
32193219
};
32203220

3221-
static const struct file_operations ctl_fops = {
3222-
.owner = THIS_MODULE,
3223-
.unlocked_ioctl = ctl_ioctl,
3224-
.poll = ctl_poll,
3225-
.fasync = ctl_fasync,
3226-
#ifdef CONFIG_COMPAT
3227-
.compat_ioctl = ctl_ioctl_compat,
3228-
#endif
3229-
};
3230-
3231-
static struct miscdevice ctl_dev = {
3232-
.minor = MPT3SAS_MINOR,
3233-
.name = MPT3SAS_DEV_NAME,
3234-
.fops = &ctl_fops,
3235-
};
3236-
32373221
/**
32383222
* ctl_init - main entry point for ctl.
32393223
*
@@ -3242,10 +3226,6 @@ void
32423226
ctl_init(void)
32433227
{
32443228
async_queue = NULL;
3245-
if (misc_register(&ctl_dev) < 0)
3246-
pr_err("%s can't register misc device [minor=%d]\n",
3247-
MPT3SAS_DRIVER_NAME, MPT3SAS_MINOR);
3248-
32493229
init_waitqueue_head(&ctl_poll_wait);
32503230
}
32513231

@@ -3279,5 +3259,4 @@ ctl_exit(void)
32793259

32803260
kfree(ioc->event_log);
32813261
}
3282-
misc_deregister(&ctl_dev);
32833262
}

drivers/scsi/mpt3sas/mpt3sas_module.c

Lines changed: 252 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,252 @@
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: [email protected])
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+
49+
MODULE_AUTHOR(MPT3SAS_AUTHOR);
50+
MODULE_DESCRIPTION(MPT3SAS_DESCRIPTION);
51+
MODULE_LICENSE("GPL");
52+
MODULE_VERSION(MPT3SAS_DRIVER_VERSION);
53+
54+
/* shost template */
55+
static struct scsi_host_template mpt3sas_driver_template = {
56+
.module = THIS_MODULE,
57+
.name = "Fusion MPT SAS Host",
58+
.proc_name = MPT3SAS_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 = MPT3SAS_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 */
85+
static struct raid_function_template mpt3sas_raid_functions = {
86+
.cookie = &mpt3sas_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+
*/
95+
static const struct pci_device_id mpt3sas_pci_table[] = {
96+
{ MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3004,
97+
PCI_ANY_ID, PCI_ANY_ID },
98+
{ MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3008,
99+
PCI_ANY_ID, PCI_ANY_ID },
100+
/* Invader ~ 3108 */
101+
{ MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3108_1,
102+
PCI_ANY_ID, PCI_ANY_ID },
103+
{ MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3108_2,
104+
PCI_ANY_ID, PCI_ANY_ID },
105+
{ MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3108_5,
106+
PCI_ANY_ID, PCI_ANY_ID },
107+
{ MPI2_MFGPAGE_VENDORID_LSI, MPI25_MFGPAGE_DEVID_SAS3108_6,
108+
PCI_ANY_ID, PCI_ANY_ID },
109+
{0} /* Terminating entry */
110+
};
111+
MODULE_DEVICE_TABLE(pci, mpt3sas_pci_table);
112+
113+
static const struct file_operations mpt3sas_ctl_fops = {
114+
.owner = THIS_MODULE,
115+
.unlocked_ioctl = ctl_ioctl,
116+
.poll = ctl_poll,
117+
.fasync = ctl_fasync,
118+
#ifdef CONFIG_COMPAT
119+
.compat_ioctl = ctl_ioctl_compat,
120+
#endif
121+
};
122+
123+
static struct miscdevice mpt3sas_ctl_dev = {
124+
.minor = MPT3SAS_MINOR,
125+
.name = MPT3SAS_DEV_NAME,
126+
.fops = &mpt3sas_ctl_fops,
127+
};
128+
129+
/**
130+
* mpt3sas_ctl_init - main entry point for ctl.
131+
*
132+
*/
133+
void
134+
mpt3sas_ctl_init(void)
135+
{
136+
ctl_init();
137+
if (misc_register(&mpt3sas_ctl_dev) < 0)
138+
pr_err("%s can't register misc device [minor=%d]\n",
139+
MPT3SAS_DRIVER_NAME, MPT3SAS_MINOR);
140+
}
141+
142+
/**
143+
* mpt3sas_ctl_exit - exit point for ctl
144+
*
145+
*/
146+
void
147+
mpt3sas_ctl_exit(void)
148+
{
149+
ctl_exit();
150+
misc_deregister(&mpt3sas_ctl_dev);
151+
}
152+
153+
/**
154+
* _mpt3sas_probe - attach and add scsi host
155+
* @pdev: PCI device struct
156+
* @id: pci device id
157+
*
158+
* Returns 0 success, anything else error.
159+
*/
160+
static int
161+
_mpt3sas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
162+
{
163+
struct Scsi_Host *shost;
164+
int rv;
165+
166+
shost = scsi_host_alloc(&mpt3sas_driver_template,
167+
sizeof(struct MPT3SAS_ADAPTER));
168+
if (!shost)
169+
return -ENODEV;
170+
171+
rv = scsih_probe(pdev, shost);
172+
return rv;
173+
}
174+
175+
static struct pci_error_handlers _mpt3sas_err_handler = {
176+
.error_detected = scsih_pci_error_detected,
177+
.mmio_enabled = scsih_pci_mmio_enabled,
178+
.slot_reset = scsih_pci_slot_reset,
179+
.resume = scsih_pci_resume,
180+
};
181+
182+
static struct pci_driver mpt3sas_driver = {
183+
.name = MPT3SAS_DRIVER_NAME,
184+
.id_table = mpt3sas_pci_table,
185+
.probe = _mpt3sas_probe,
186+
.remove = scsih_remove,
187+
.shutdown = scsih_shutdown,
188+
.err_handler = &_mpt3sas_err_handler,
189+
#ifdef CONFIG_PM
190+
.suspend = scsih_suspend,
191+
.resume = scsih_resume,
192+
#endif
193+
};
194+
195+
/**
196+
* _mpt3sas_init - main entry point for this driver.
197+
*
198+
* Returns 0 success, anything else error.
199+
*/
200+
static int __init
201+
_mpt3sas_init(void)
202+
{
203+
int error;
204+
205+
pr_info("%s version %s loaded\n", MPT3SAS_DRIVER_NAME,
206+
MPT3SAS_DRIVER_VERSION);
207+
208+
mpt3sas_transport_template =
209+
sas_attach_transport(&mpt3sas_transport_functions);
210+
if (!mpt3sas_transport_template)
211+
return -ENODEV;
212+
213+
mpt3sas_raid_template = raid_class_attach(&mpt3sas_raid_functions);
214+
if (!mpt3sas_raid_template) {
215+
sas_release_transport(mpt3sas_transport_template);
216+
return -ENODEV;
217+
}
218+
219+
error = scsih_init();
220+
if (error) {
221+
scsih_exit();
222+
return error;
223+
}
224+
225+
mpt3sas_ctl_init();
226+
227+
error = pci_register_driver(&mpt3sas_driver);
228+
if (error)
229+
scsih_exit();
230+
231+
return error;
232+
}
233+
234+
/**
235+
* _mpt3sas_exit - exit point for this driver (when it is a module).
236+
*
237+
*/
238+
static void __exit
239+
_mpt3sas_exit(void)
240+
{
241+
pr_info("mpt3sas version %s unloading\n",
242+
MPT3SAS_DRIVER_VERSION);
243+
244+
pci_unregister_driver(&mpt3sas_driver);
245+
246+
mpt3sas_ctl_exit();
247+
248+
scsih_exit();
249+
}
250+
251+
module_init(_mpt3sas_init);
252+
module_exit(_mpt3sas_exit);

0 commit comments

Comments
 (0)