@@ -426,14 +426,6 @@ static int sja1105_init_general_params(struct sja1105_private *priv)
426
426
.tpid2 = ETH_P_SJA1105 ,
427
427
};
428
428
struct sja1105_table * table ;
429
- int i , k = 0 ;
430
-
431
- for (i = 0 ; i < SJA1105_NUM_PORTS ; i ++ ) {
432
- if (dsa_is_dsa_port (priv -> ds , i ))
433
- default_general_params .casc_port = i ;
434
- else if (dsa_is_user_port (priv -> ds , i ))
435
- priv -> ports [i ].mgmt_slot = k ++ ;
436
- }
437
429
438
430
table = & priv -> static_config .tables [BLK_IDX_GENERAL_PARAMS ];
439
431
@@ -1740,6 +1732,16 @@ static int sja1105_setup(struct dsa_switch *ds)
1740
1732
static void sja1105_teardown (struct dsa_switch * ds )
1741
1733
{
1742
1734
struct sja1105_private * priv = ds -> priv ;
1735
+ int port ;
1736
+
1737
+ for (port = 0 ; port < SJA1105_NUM_PORTS ; port ++ ) {
1738
+ struct sja1105_port * sp = & priv -> ports [port ];
1739
+
1740
+ if (!dsa_is_user_port (ds , port ))
1741
+ continue ;
1742
+
1743
+ kthread_destroy_worker (sp -> xmit_worker );
1744
+ }
1743
1745
1744
1746
sja1105_tas_teardown (ds );
1745
1747
sja1105_ptp_clock_unregister (ds );
@@ -1761,6 +1763,18 @@ static int sja1105_port_enable(struct dsa_switch *ds, int port,
1761
1763
return 0 ;
1762
1764
}
1763
1765
1766
+ static void sja1105_port_disable (struct dsa_switch * ds , int port )
1767
+ {
1768
+ struct sja1105_private * priv = ds -> priv ;
1769
+ struct sja1105_port * sp = & priv -> ports [port ];
1770
+
1771
+ if (!dsa_is_user_port (ds , port ))
1772
+ return ;
1773
+
1774
+ kthread_cancel_work_sync (& sp -> xmit_work );
1775
+ skb_queue_purge (& sp -> xmit_queue );
1776
+ }
1777
+
1764
1778
static int sja1105_mgmt_xmit (struct dsa_switch * ds , int port , int slot ,
1765
1779
struct sk_buff * skb , bool takets )
1766
1780
{
@@ -1819,47 +1833,36 @@ static int sja1105_mgmt_xmit(struct dsa_switch *ds, int port, int slot,
1819
1833
return NETDEV_TX_OK ;
1820
1834
}
1821
1835
1836
+ #define work_to_port (work ) \
1837
+ container_of((work), struct sja1105_port, xmit_work)
1838
+ #define tagger_to_sja1105 (t ) \
1839
+ container_of((t), struct sja1105_private, tagger_data)
1840
+
1822
1841
/* Deferred work is unfortunately necessary because setting up the management
1823
1842
* route cannot be done from atomit context (SPI transfer takes a sleepable
1824
1843
* lock on the bus)
1825
1844
*/
1826
- static netdev_tx_t sja1105_port_deferred_xmit (struct dsa_switch * ds , int port ,
1827
- struct sk_buff * skb )
1845
+ static void sja1105_port_deferred_xmit (struct kthread_work * work )
1828
1846
{
1829
- struct sja1105_private * priv = ds -> priv ;
1830
- struct sja1105_port * sp = & priv -> ports [port ];
1831
- int slot = sp -> mgmt_slot ;
1832
- struct sk_buff * clone ;
1833
-
1834
- /* The tragic fact about the switch having 4x2 slots for installing
1835
- * management routes is that all of them except one are actually
1836
- * useless.
1837
- * If 2 slots are simultaneously configured for two BPDUs sent to the
1838
- * same (multicast) DMAC but on different egress ports, the switch
1839
- * would confuse them and redirect first frame it receives on the CPU
1840
- * port towards the port configured on the numerically first slot
1841
- * (therefore wrong port), then second received frame on second slot
1842
- * (also wrong port).
1843
- * So for all practical purposes, there needs to be a lock that
1844
- * prevents that from happening. The slot used here is utterly useless
1845
- * (could have simply been 0 just as fine), but we are doing it
1846
- * nonetheless, in case a smarter idea ever comes up in the future.
1847
- */
1848
- mutex_lock (& priv -> mgmt_lock );
1847
+ struct sja1105_port * sp = work_to_port (work );
1848
+ struct sja1105_tagger_data * tagger_data = sp -> data ;
1849
+ struct sja1105_private * priv = tagger_to_sja1105 (tagger_data );
1850
+ int port = sp - priv -> ports ;
1851
+ struct sk_buff * skb ;
1849
1852
1850
- /* The clone, if there, was made by dsa_skb_tx_timestamp */
1851
- clone = DSA_SKB_CB (skb )-> clone ;
1853
+ while (( skb = skb_dequeue ( & sp -> xmit_queue )) != NULL ) {
1854
+ struct sk_buff * clone = DSA_SKB_CB (skb )-> clone ;
1852
1855
1853
- sja1105_mgmt_xmit ( ds , port , slot , skb , !! clone );
1856
+ mutex_lock ( & priv -> mgmt_lock );
1854
1857
1855
- if (!clone )
1856
- goto out ;
1858
+ sja1105_mgmt_xmit (priv -> ds , port , 0 , skb , !!clone );
1857
1859
1858
- sja1105_ptp_txtstamp_skb (ds , port , clone );
1860
+ /* The clone, if there, was made by dsa_skb_tx_timestamp */
1861
+ if (clone )
1862
+ sja1105_ptp_txtstamp_skb (priv -> ds , port , clone );
1859
1863
1860
- out :
1861
- mutex_unlock (& priv -> mgmt_lock );
1862
- return NETDEV_TX_OK ;
1864
+ mutex_unlock (& priv -> mgmt_lock );
1865
+ }
1863
1866
}
1864
1867
1865
1868
/* The MAXAGE setting belongs to the L2 Forwarding Parameters table,
@@ -1990,6 +1993,7 @@ static const struct dsa_switch_ops sja1105_switch_ops = {
1990
1993
.get_sset_count = sja1105_get_sset_count ,
1991
1994
.get_ts_info = sja1105_get_ts_info ,
1992
1995
.port_enable = sja1105_port_enable ,
1996
+ .port_disable = sja1105_port_disable ,
1993
1997
.port_fdb_dump = sja1105_fdb_dump ,
1994
1998
.port_fdb_add = sja1105_fdb_add ,
1995
1999
.port_fdb_del = sja1105_fdb_del ,
@@ -2003,7 +2007,6 @@ static const struct dsa_switch_ops sja1105_switch_ops = {
2003
2007
.port_mdb_prepare = sja1105_mdb_prepare ,
2004
2008
.port_mdb_add = sja1105_mdb_add ,
2005
2009
.port_mdb_del = sja1105_mdb_del ,
2006
- .port_deferred_xmit = sja1105_port_deferred_xmit ,
2007
2010
.port_hwtstamp_get = sja1105_hwtstamp_get ,
2008
2011
.port_hwtstamp_set = sja1105_hwtstamp_set ,
2009
2012
.port_rxtstamp = sja1105_port_rxtstamp ,
@@ -2055,7 +2058,7 @@ static int sja1105_probe(struct spi_device *spi)
2055
2058
struct device * dev = & spi -> dev ;
2056
2059
struct sja1105_private * priv ;
2057
2060
struct dsa_switch * ds ;
2058
- int rc , i ;
2061
+ int rc , port ;
2059
2062
2060
2063
if (!dev -> of_node ) {
2061
2064
dev_err (dev , "No DTS bindings for SJA1105 driver\n" );
@@ -2120,15 +2123,42 @@ static int sja1105_probe(struct spi_device *spi)
2120
2123
return rc ;
2121
2124
2122
2125
/* Connections between dsa_port and sja1105_port */
2123
- for (i = 0 ; i < SJA1105_NUM_PORTS ; i ++ ) {
2124
- struct sja1105_port * sp = & priv -> ports [i ];
2126
+ for (port = 0 ; port < SJA1105_NUM_PORTS ; port ++ ) {
2127
+ struct sja1105_port * sp = & priv -> ports [port ];
2128
+ struct dsa_port * dp = dsa_to_port (ds , port );
2129
+ struct net_device * slave ;
2125
2130
2126
- dsa_to_port (ds , i )-> priv = sp ;
2127
- sp -> dp = dsa_to_port (ds , i );
2131
+ if (!dsa_is_user_port (ds , port ))
2132
+ continue ;
2133
+
2134
+ dp -> priv = sp ;
2135
+ sp -> dp = dp ;
2128
2136
sp -> data = tagger_data ;
2137
+ slave = dp -> slave ;
2138
+ kthread_init_work (& sp -> xmit_work , sja1105_port_deferred_xmit );
2139
+ sp -> xmit_worker = kthread_create_worker (0 , "%s_xmit" ,
2140
+ slave -> name );
2141
+ if (IS_ERR (sp -> xmit_worker )) {
2142
+ rc = PTR_ERR (sp -> xmit_worker );
2143
+ dev_err (ds -> dev ,
2144
+ "failed to create deferred xmit thread: %d\n" ,
2145
+ rc );
2146
+ goto out ;
2147
+ }
2148
+ skb_queue_head_init (& sp -> xmit_queue );
2129
2149
}
2130
2150
2131
2151
return 0 ;
2152
+ out :
2153
+ while (port -- > 0 ) {
2154
+ struct sja1105_port * sp = & priv -> ports [port ];
2155
+
2156
+ if (!dsa_is_user_port (ds , port ))
2157
+ continue ;
2158
+
2159
+ kthread_destroy_worker (sp -> xmit_worker );
2160
+ }
2161
+ return rc ;
2132
2162
}
2133
2163
2134
2164
static int sja1105_remove (struct spi_device * spi )
0 commit comments