88
99#include "ionic.h"
1010#include "ionic_bus.h"
11+ #include "ionic_debugfs.h"
1112
1213/* Supported devices */
1314static const struct pci_device_id ionic_id_table [] = {
@@ -17,10 +18,68 @@ static const struct pci_device_id ionic_id_table[] = {
1718};
1819MODULE_DEVICE_TABLE (pci , ionic_id_table );
1920
21+ const char * ionic_bus_info (struct ionic * ionic )
22+ {
23+ return pci_name (ionic -> pdev );
24+ }
25+
26+ static int ionic_map_bars (struct ionic * ionic )
27+ {
28+ struct pci_dev * pdev = ionic -> pdev ;
29+ struct device * dev = ionic -> dev ;
30+ struct ionic_dev_bar * bars ;
31+ unsigned int i , j ;
32+
33+ bars = ionic -> bars ;
34+ ionic -> num_bars = 0 ;
35+
36+ for (i = 0 , j = 0 ; i < IONIC_BARS_MAX ; i ++ ) {
37+ if (!(pci_resource_flags (pdev , i ) & IORESOURCE_MEM ))
38+ continue ;
39+ bars [j ].len = pci_resource_len (pdev , i );
40+
41+ /* only map the whole bar 0 */
42+ if (j > 0 ) {
43+ bars [j ].vaddr = NULL ;
44+ } else {
45+ bars [j ].vaddr = pci_iomap (pdev , i , bars [j ].len );
46+ if (!bars [j ].vaddr ) {
47+ dev_err (dev ,
48+ "Cannot memory-map BAR %d, aborting\n" ,
49+ i );
50+ return - ENODEV ;
51+ }
52+ }
53+
54+ bars [j ].bus_addr = pci_resource_start (pdev , i );
55+ bars [j ].res_index = i ;
56+ ionic -> num_bars ++ ;
57+ j ++ ;
58+ }
59+
60+ return 0 ;
61+ }
62+
63+ static void ionic_unmap_bars (struct ionic * ionic )
64+ {
65+ struct ionic_dev_bar * bars = ionic -> bars ;
66+ unsigned int i ;
67+
68+ for (i = 0 ; i < IONIC_BARS_MAX ; i ++ ) {
69+ if (bars [i ].vaddr ) {
70+ iounmap (bars [i ].vaddr );
71+ bars [i ].bus_addr = 0 ;
72+ bars [i ].vaddr = NULL ;
73+ bars [i ].len = 0 ;
74+ }
75+ }
76+ }
77+
2078static int ionic_probe (struct pci_dev * pdev , const struct pci_device_id * ent )
2179{
2280 struct device * dev = & pdev -> dev ;
2381 struct ionic * ionic ;
82+ int err ;
2483
2584 ionic = ionic_devlink_alloc (dev );
2685 if (!ionic )
@@ -29,14 +88,96 @@ static int ionic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
2988 ionic -> pdev = pdev ;
3089 ionic -> dev = dev ;
3190 pci_set_drvdata (pdev , ionic );
91+ mutex_init (& ionic -> dev_cmd_lock );
92+
93+ /* Query system for DMA addressing limitation for the device. */
94+ err = dma_set_mask_and_coherent (dev , DMA_BIT_MASK (IONIC_ADDR_LEN ));
95+ if (err ) {
96+ dev_err (dev , "Unable to obtain 64-bit DMA for consistent allocations, aborting. err=%d\n" ,
97+ err );
98+ goto err_out_clear_drvdata ;
99+ }
100+
101+ ionic_debugfs_add_dev (ionic );
102+
103+ /* Setup PCI device */
104+ err = pci_enable_device_mem (pdev );
105+ if (err ) {
106+ dev_err (dev , "Cannot enable PCI device: %d, aborting\n" , err );
107+ goto err_out_debugfs_del_dev ;
108+ }
109+
110+ err = pci_request_regions (pdev , IONIC_DRV_NAME );
111+ if (err ) {
112+ dev_err (dev , "Cannot request PCI regions: %d, aborting\n" , err );
113+ goto err_out_pci_disable_device ;
114+ }
115+
116+ pci_set_master (pdev );
117+
118+ err = ionic_map_bars (ionic );
119+ if (err )
120+ goto err_out_pci_clear_master ;
121+
122+ /* Configure the device */
123+ err = ionic_setup (ionic );
124+ if (err ) {
125+ dev_err (dev , "Cannot setup device: %d, aborting\n" , err );
126+ goto err_out_unmap_bars ;
127+ }
128+
129+ err = ionic_identify (ionic );
130+ if (err ) {
131+ dev_err (dev , "Cannot identify device: %d, aborting\n" , err );
132+ goto err_out_teardown ;
133+ }
134+
135+ err = ionic_init (ionic );
136+ if (err ) {
137+ dev_err (dev , "Cannot init device: %d, aborting\n" , err );
138+ goto err_out_teardown ;
139+ }
140+
141+ err = ionic_devlink_register (ionic );
142+ if (err )
143+ dev_err (dev , "Cannot register devlink: %d\n" , err );
32144
33145 return 0 ;
146+
147+ err_out_teardown :
148+ ionic_dev_teardown (ionic );
149+ err_out_unmap_bars :
150+ ionic_unmap_bars (ionic );
151+ pci_release_regions (pdev );
152+ err_out_pci_clear_master :
153+ pci_clear_master (pdev );
154+ err_out_pci_disable_device :
155+ pci_disable_device (pdev );
156+ err_out_debugfs_del_dev :
157+ ionic_debugfs_del_dev (ionic );
158+ err_out_clear_drvdata :
159+ mutex_destroy (& ionic -> dev_cmd_lock );
160+ ionic_devlink_free (ionic );
161+
162+ return err ;
34163}
35164
36165static void ionic_remove (struct pci_dev * pdev )
37166{
38167 struct ionic * ionic = pci_get_drvdata (pdev );
39168
169+ if (!ionic )
170+ return ;
171+
172+ ionic_devlink_unregister (ionic );
173+ ionic_reset (ionic );
174+ ionic_dev_teardown (ionic );
175+ ionic_unmap_bars (ionic );
176+ pci_release_regions (pdev );
177+ pci_clear_master (pdev );
178+ pci_disable_device (pdev );
179+ ionic_debugfs_del_dev (ionic );
180+ mutex_destroy (& ionic -> dev_cmd_lock );
40181 ionic_devlink_free (ionic );
41182}
42183
0 commit comments