@@ -544,6 +544,19 @@ static void unmap_group_regs(struct gfar_private *priv)
544
544
iounmap (priv -> gfargrp [i ].regs );
545
545
}
546
546
547
+ static void free_gfar_dev (struct gfar_private * priv )
548
+ {
549
+ int i , j ;
550
+
551
+ for (i = 0 ; i < priv -> num_grps ; i ++ )
552
+ for (j = 0 ; j < GFAR_NUM_IRQS ; j ++ ) {
553
+ kfree (priv -> gfargrp [i ].irqinfo [j ]);
554
+ priv -> gfargrp [i ].irqinfo [j ] = NULL ;
555
+ }
556
+
557
+ free_netdev (priv -> ndev );
558
+ }
559
+
547
560
static void disable_napi (struct gfar_private * priv )
548
561
{
549
562
int i ;
@@ -565,20 +578,36 @@ static int gfar_parse_group(struct device_node *np,
565
578
{
566
579
struct gfar_priv_grp * grp = & priv -> gfargrp [priv -> num_grps ];
567
580
u32 * queue_mask ;
581
+ int i ;
582
+
583
+ if (priv -> mode == MQ_MG_MODE ) {
584
+ for (i = 0 ; i < GFAR_NUM_IRQS ; i ++ ) {
585
+ grp -> irqinfo [i ] = kzalloc (sizeof (struct gfar_irqinfo ),
586
+ GFP_KERNEL );
587
+ if (!grp -> irqinfo [i ])
588
+ return - ENOMEM ;
589
+ }
590
+ } else {
591
+ grp -> irqinfo [GFAR_TX ] = kzalloc (sizeof (struct gfar_irqinfo ),
592
+ GFP_KERNEL );
593
+ if (!grp -> irqinfo [GFAR_TX ])
594
+ return - ENOMEM ;
595
+ grp -> irqinfo [GFAR_RX ] = grp -> irqinfo [GFAR_ER ] = NULL ;
596
+ }
568
597
569
598
grp -> regs = of_iomap (np , 0 );
570
599
if (!grp -> regs )
571
600
return - ENOMEM ;
572
601
573
- grp -> interruptTransmit = irq_of_parse_and_map (np , 0 );
602
+ gfar_irq ( grp , TX ) -> irq = irq_of_parse_and_map (np , 0 );
574
603
575
604
/* If we aren't the FEC we have multiple interrupts */
576
605
if (model && strcasecmp (model , "FEC" )) {
577
- grp -> interruptReceive = irq_of_parse_and_map (np , 1 );
578
- grp -> interruptError = irq_of_parse_and_map (np , 2 );
579
- if (grp -> interruptTransmit == NO_IRQ ||
580
- grp -> interruptReceive == NO_IRQ ||
581
- grp -> interruptError == NO_IRQ )
606
+ gfar_irq ( grp , RX ) -> irq = irq_of_parse_and_map (np , 1 );
607
+ gfar_irq ( grp , ER ) -> irq = irq_of_parse_and_map (np , 2 );
608
+ if (gfar_irq ( grp , TX ) -> irq == NO_IRQ ||
609
+ gfar_irq ( grp , RX ) -> irq == NO_IRQ ||
610
+ gfar_irq ( grp , ER ) -> irq == NO_IRQ )
582
611
return - EINVAL ;
583
612
}
584
613
@@ -779,7 +808,7 @@ static int gfar_of_init(struct platform_device *ofdev, struct net_device **pdev)
779
808
free_tx_pointers (priv );
780
809
err_grp_init :
781
810
unmap_group_regs (priv );
782
- free_netdev ( dev );
811
+ free_gfar_dev ( priv );
783
812
return err ;
784
813
}
785
814
@@ -1184,15 +1213,16 @@ static int gfar_probe(struct platform_device *ofdev)
1184
1213
1185
1214
/* fill out IRQ number and name fields */
1186
1215
for (i = 0 ; i < priv -> num_grps ; i ++ ) {
1216
+ struct gfar_priv_grp * grp = & priv -> gfargrp [i ];
1187
1217
if (priv -> device_flags & FSL_GIANFAR_DEV_HAS_MULTI_INTR ) {
1188
- sprintf (priv -> gfargrp [ i ]. int_name_tx , "%s%s%c%s" ,
1218
+ sprintf (gfar_irq ( grp , TX ) -> name , "%s%s%c%s" ,
1189
1219
dev -> name , "_g" , '0' + i , "_tx" );
1190
- sprintf (priv -> gfargrp [ i ]. int_name_rx , "%s%s%c%s" ,
1220
+ sprintf (gfar_irq ( grp , RX ) -> name , "%s%s%c%s" ,
1191
1221
dev -> name , "_g" , '0' + i , "_rx" );
1192
- sprintf (priv -> gfargrp [ i ]. int_name_er , "%s%s%c%s" ,
1222
+ sprintf (gfar_irq ( grp , ER ) -> name , "%s%s%c%s" ,
1193
1223
dev -> name , "_g" , '0' + i , "_er" );
1194
1224
} else
1195
- strcpy (priv -> gfargrp [ i ]. int_name_tx , dev -> name );
1225
+ strcpy (gfar_irq ( grp , TX ) -> name , dev -> name );
1196
1226
}
1197
1227
1198
1228
/* Initialize the filer table */
@@ -1225,7 +1255,7 @@ static int gfar_probe(struct platform_device *ofdev)
1225
1255
of_node_put (priv -> phy_node );
1226
1256
if (priv -> tbi_node )
1227
1257
of_node_put (priv -> tbi_node );
1228
- free_netdev ( dev );
1258
+ free_gfar_dev ( priv );
1229
1259
return err ;
1230
1260
}
1231
1261
@@ -1242,7 +1272,7 @@ static int gfar_remove(struct platform_device *ofdev)
1242
1272
1243
1273
unregister_netdev (priv -> ndev );
1244
1274
unmap_group_regs (priv );
1245
- free_netdev (priv -> ndev );
1275
+ free_gfar_dev (priv );
1246
1276
1247
1277
return 0 ;
1248
1278
}
@@ -1650,9 +1680,9 @@ void gfar_halt(struct net_device *dev)
1650
1680
1651
1681
static void free_grp_irqs (struct gfar_priv_grp * grp )
1652
1682
{
1653
- free_irq (grp -> interruptError , grp );
1654
- free_irq (grp -> interruptTransmit , grp );
1655
- free_irq (grp -> interruptReceive , grp );
1683
+ free_irq (gfar_irq ( grp , TX ) -> irq , grp );
1684
+ free_irq (gfar_irq ( grp , RX ) -> irq , grp );
1685
+ free_irq (gfar_irq ( grp , ER ) -> irq , grp );
1656
1686
}
1657
1687
1658
1688
void stop_gfar (struct net_device * dev )
@@ -1681,7 +1711,7 @@ void stop_gfar(struct net_device *dev)
1681
1711
free_grp_irqs (& priv -> gfargrp [i ]);
1682
1712
} else {
1683
1713
for (i = 0 ; i < priv -> num_grps ; i ++ )
1684
- free_irq (priv -> gfargrp [i ]. interruptTransmit ,
1714
+ free_irq (gfar_irq ( & priv -> gfargrp [i ], TX ) -> irq ,
1685
1715
& priv -> gfargrp [i ]);
1686
1716
}
1687
1717
@@ -1856,42 +1886,44 @@ static int register_grp_irqs(struct gfar_priv_grp *grp)
1856
1886
/* Install our interrupt handlers for Error,
1857
1887
* Transmit, and Receive
1858
1888
*/
1859
- if ((err = request_irq (grp -> interruptError , gfar_error ,
1860
- 0 , grp -> int_name_er , grp )) < 0 ) {
1889
+ err = request_irq (gfar_irq (grp , ER )-> irq , gfar_error , 0 ,
1890
+ gfar_irq (grp , ER )-> name , grp );
1891
+ if (err < 0 ) {
1861
1892
netif_err (priv , intr , dev , "Can't get IRQ %d\n" ,
1862
- grp -> interruptError );
1893
+ gfar_irq ( grp , ER ) -> irq );
1863
1894
1864
1895
goto err_irq_fail ;
1865
1896
}
1866
-
1867
- if (( err = request_irq (grp -> interruptTransmit , gfar_transmit ,
1868
- 0 , grp -> int_name_tx , grp )) < 0 ) {
1897
+ err = request_irq ( gfar_irq ( grp , TX ) -> irq , gfar_transmit , 0 ,
1898
+ gfar_irq (grp , TX ) -> name , grp );
1899
+ if ( err < 0 ) {
1869
1900
netif_err (priv , intr , dev , "Can't get IRQ %d\n" ,
1870
- grp -> interruptTransmit );
1901
+ gfar_irq ( grp , TX ) -> irq );
1871
1902
goto tx_irq_fail ;
1872
1903
}
1873
-
1874
- if (( err = request_irq (grp -> interruptReceive , gfar_receive ,
1875
- 0 , grp -> int_name_rx , grp )) < 0 ) {
1904
+ err = request_irq ( gfar_irq ( grp , RX ) -> irq , gfar_receive , 0 ,
1905
+ gfar_irq (grp , RX ) -> name , grp );
1906
+ if ( err < 0 ) {
1876
1907
netif_err (priv , intr , dev , "Can't get IRQ %d\n" ,
1877
- grp -> interruptReceive );
1908
+ gfar_irq ( grp , RX ) -> irq );
1878
1909
goto rx_irq_fail ;
1879
1910
}
1880
1911
} else {
1881
- if ((err = request_irq (grp -> interruptTransmit , gfar_interrupt ,
1882
- 0 , grp -> int_name_tx , grp )) < 0 ) {
1912
+ err = request_irq (gfar_irq (grp , TX )-> irq , gfar_interrupt , 0 ,
1913
+ gfar_irq (grp , TX )-> name , grp );
1914
+ if (err < 0 ) {
1883
1915
netif_err (priv , intr , dev , "Can't get IRQ %d\n" ,
1884
- grp -> interruptTransmit );
1916
+ gfar_irq ( grp , TX ) -> irq );
1885
1917
goto err_irq_fail ;
1886
1918
}
1887
1919
}
1888
1920
1889
1921
return 0 ;
1890
1922
1891
1923
rx_irq_fail :
1892
- free_irq (grp -> interruptTransmit , grp );
1924
+ free_irq (gfar_irq ( grp , TX ) -> irq , grp );
1893
1925
tx_irq_fail :
1894
- free_irq (grp -> interruptError , grp );
1926
+ free_irq (gfar_irq ( grp , ER ) -> irq , grp );
1895
1927
err_irq_fail :
1896
1928
return err ;
1897
1929
0 commit comments