122122#include "xgbe.h"
123123#include "xgbe-common.h"
124124
125- static int xgbe_config_msi (struct xgbe_prv_data * pdata )
125+ static int xgbe_config_multi_msi (struct xgbe_prv_data * pdata )
126126{
127- unsigned int msi_count ;
127+ unsigned int vector_count ;
128128 unsigned int i , j ;
129129 int ret ;
130130
131- msi_count = XGBE_MSIX_BASE_COUNT ;
132- msi_count += max (pdata -> rx_ring_count ,
133- pdata -> tx_ring_count );
134- msi_count = roundup_pow_of_two (msi_count );
131+ vector_count = XGBE_MSI_BASE_COUNT ;
132+ vector_count += max (pdata -> rx_ring_count ,
133+ pdata -> tx_ring_count );
135134
136- ret = pci_enable_msi_exact (pdata -> pcidev , msi_count );
135+ ret = pci_alloc_irq_vectors (pdata -> pcidev , XGBE_MSI_MIN_COUNT ,
136+ vector_count , PCI_IRQ_MSI | PCI_IRQ_MSIX );
137137 if (ret < 0 ) {
138- dev_info (pdata -> dev , "MSI request for %u interrupts failed\n" ,
139- msi_count );
140-
141- ret = pci_enable_msi (pdata -> pcidev );
142- if (ret < 0 ) {
143- dev_info (pdata -> dev , "MSI enablement failed\n" );
144- return ret ;
145- }
146-
147- msi_count = 1 ;
148- }
149-
150- pdata -> irq_count = msi_count ;
151-
152- pdata -> dev_irq = pdata -> pcidev -> irq ;
153-
154- if (msi_count > 1 ) {
155- pdata -> ecc_irq = pdata -> pcidev -> irq + 1 ;
156- pdata -> i2c_irq = pdata -> pcidev -> irq + 2 ;
157- pdata -> an_irq = pdata -> pcidev -> irq + 3 ;
158-
159- for (i = XGBE_MSIX_BASE_COUNT , j = 0 ;
160- (i < msi_count ) && (j < XGBE_MAX_DMA_CHANNELS );
161- i ++ , j ++ )
162- pdata -> channel_irq [j ] = pdata -> pcidev -> irq + i ;
163- pdata -> channel_irq_count = j ;
164-
165- pdata -> per_channel_irq = 1 ;
166- pdata -> channel_irq_mode = XGBE_IRQ_MODE_LEVEL ;
167- } else {
168- pdata -> ecc_irq = pdata -> pcidev -> irq ;
169- pdata -> i2c_irq = pdata -> pcidev -> irq ;
170- pdata -> an_irq = pdata -> pcidev -> irq ;
171- }
172-
173- if (netif_msg_probe (pdata ))
174- dev_dbg (pdata -> dev , "MSI interrupts enabled\n" );
175-
176- return 0 ;
177- }
178-
179- static int xgbe_config_msix (struct xgbe_prv_data * pdata )
180- {
181- unsigned int msix_count ;
182- unsigned int i , j ;
183- int ret ;
184-
185- msix_count = XGBE_MSIX_BASE_COUNT ;
186- msix_count += max (pdata -> rx_ring_count ,
187- pdata -> tx_ring_count );
188-
189- pdata -> msix_entries = devm_kcalloc (pdata -> dev , msix_count ,
190- sizeof (struct msix_entry ),
191- GFP_KERNEL );
192- if (!pdata -> msix_entries )
193- return - ENOMEM ;
194-
195- for (i = 0 ; i < msix_count ; i ++ )
196- pdata -> msix_entries [i ].entry = i ;
197-
198- ret = pci_enable_msix_range (pdata -> pcidev , pdata -> msix_entries ,
199- XGBE_MSIX_MIN_COUNT , msix_count );
200- if (ret < 0 ) {
201- dev_info (pdata -> dev , "MSI-X enablement failed\n" );
202- devm_kfree (pdata -> dev , pdata -> msix_entries );
203- pdata -> msix_entries = NULL ;
138+ dev_info (pdata -> dev , "multi MSI/MSI-X enablement failed\n" );
204139 return ret ;
205140 }
206141
207142 pdata -> irq_count = ret ;
208143
209- pdata -> dev_irq = pdata -> msix_entries [ 0 ]. vector ;
210- pdata -> ecc_irq = pdata -> msix_entries [ 1 ]. vector ;
211- pdata -> i2c_irq = pdata -> msix_entries [ 2 ]. vector ;
212- pdata -> an_irq = pdata -> msix_entries [ 3 ]. vector ;
144+ pdata -> dev_irq = pci_irq_vector ( pdata -> pcidev , 0 ) ;
145+ pdata -> ecc_irq = pci_irq_vector ( pdata -> pcidev , 1 ) ;
146+ pdata -> i2c_irq = pci_irq_vector ( pdata -> pcidev , 2 ) ;
147+ pdata -> an_irq = pci_irq_vector ( pdata -> pcidev , 3 ) ;
213148
214- for (i = XGBE_MSIX_BASE_COUNT , j = 0 ; i < ret ; i ++ , j ++ )
215- pdata -> channel_irq [j ] = pdata -> msix_entries [ i ]. vector ;
149+ for (i = XGBE_MSI_BASE_COUNT , j = 0 ; i < ret ; i ++ , j ++ )
150+ pdata -> channel_irq [j ] = pci_irq_vector ( pdata -> pcidev , i ) ;
216151 pdata -> channel_irq_count = j ;
217152
218153 pdata -> per_channel_irq = 1 ;
219154 pdata -> channel_irq_mode = XGBE_IRQ_MODE_LEVEL ;
220155
221156 if (netif_msg_probe (pdata ))
222- dev_dbg (pdata -> dev , "MSI-X interrupts enabled\n" );
157+ dev_dbg (pdata -> dev , "multi %s interrupts enabled\n" ,
158+ pdata -> pcidev -> msix_enabled ? "MSI-X" : "MSI" );
223159
224160 return 0 ;
225161}
@@ -228,21 +164,28 @@ static int xgbe_config_irqs(struct xgbe_prv_data *pdata)
228164{
229165 int ret ;
230166
231- ret = xgbe_config_msix (pdata );
167+ ret = xgbe_config_multi_msi (pdata );
232168 if (!ret )
233169 goto out ;
234170
235- ret = xgbe_config_msi (pdata );
236- if (!ret )
237- goto out ;
171+ ret = pci_alloc_irq_vectors (pdata -> pcidev , 1 , 1 ,
172+ PCI_IRQ_LEGACY | PCI_IRQ_MSI );
173+ if (ret < 0 ) {
174+ dev_info (pdata -> dev , "single IRQ enablement failed\n" );
175+ return ret ;
176+ }
238177
239178 pdata -> irq_count = 1 ;
240- pdata -> irq_shared = 1 ;
179+ pdata -> channel_irq_count = 1 ;
180+
181+ pdata -> dev_irq = pci_irq_vector (pdata -> pcidev , 0 );
182+ pdata -> ecc_irq = pci_irq_vector (pdata -> pcidev , 0 );
183+ pdata -> i2c_irq = pci_irq_vector (pdata -> pcidev , 0 );
184+ pdata -> an_irq = pci_irq_vector (pdata -> pcidev , 0 );
241185
242- pdata -> dev_irq = pdata -> pcidev -> irq ;
243- pdata -> ecc_irq = pdata -> pcidev -> irq ;
244- pdata -> i2c_irq = pdata -> pcidev -> irq ;
245- pdata -> an_irq = pdata -> pcidev -> irq ;
186+ if (netif_msg_probe (pdata ))
187+ dev_dbg (pdata -> dev , "single %s interrupt enabled\n" ,
188+ pdata -> pcidev -> msi_enabled ? "MSI" : "legacy" );
246189
247190out :
248191 if (netif_msg_probe (pdata )) {
@@ -412,12 +355,15 @@ static int xgbe_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
412355 /* Configure the netdev resource */
413356 ret = xgbe_config_netdev (pdata );
414357 if (ret )
415- goto err_pci_enable ;
358+ goto err_irq_vectors ;
416359
417360 netdev_notice (pdata -> netdev , "net device enabled\n" );
418361
419362 return 0 ;
420363
364+ err_irq_vectors :
365+ pci_free_irq_vectors (pdata -> pcidev );
366+
421367err_pci_enable :
422368 xgbe_free_pdata (pdata );
423369
@@ -433,6 +379,8 @@ static void xgbe_pci_remove(struct pci_dev *pdev)
433379
434380 xgbe_deconfig_netdev (pdata );
435381
382+ pci_free_irq_vectors (pdata -> pcidev );
383+
436384 xgbe_free_pdata (pdata );
437385}
438386
0 commit comments