aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Reichel <sre@kernel.org>2016-06-17 18:58:39 -0400
committerSebastian Reichel <sre@kernel.org>2016-06-27 18:38:37 -0400
commitdf26d639e2f4628732a8da5a0f71e4e652ce809b (patch)
treeb53db2bdb9b8799b662b2b967d2bf22a74d61f59
parent866dcb9d57fcad11c2647a154b2b246ac10d0795 (diff)
HSI: ssi_protocol: fix ssip_xmit invocation
ssip_xmit should be called from process context, since it calls hsi_async_write. Signed-off-by: Sebastian Reichel <sre@kernel.org> Tested-by: Pavel Machek <pavel@ucw.cz>
-rw-r--r--drivers/hsi/clients/ssi_protocol.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/hsi/clients/ssi_protocol.c b/drivers/hsi/clients/ssi_protocol.c
index 2388857db14b..6031cd146556 100644
--- a/drivers/hsi/clients/ssi_protocol.c
+++ b/drivers/hsi/clients/ssi_protocol.c
@@ -150,6 +150,7 @@ struct ssi_protocol {
150 struct net_device *netdev; 150 struct net_device *netdev;
151 struct list_head txqueue; 151 struct list_head txqueue;
152 struct list_head cmdqueue; 152 struct list_head cmdqueue;
153 struct work_struct work;
153 struct hsi_client *cl; 154 struct hsi_client *cl;
154 struct list_head link; 155 struct list_head link;
155 atomic_t tx_usecnt; 156 atomic_t tx_usecnt;
@@ -968,6 +969,15 @@ static int ssip_pn_set_mtu(struct net_device *dev, int new_mtu)
968 return 0; 969 return 0;
969} 970}
970 971
972static void ssip_xmit_work(struct work_struct *work)
973{
974 struct ssi_protocol *ssi =
975 container_of(work, struct ssi_protocol, work);
976 struct hsi_client *cl = ssi->cl;
977
978 ssip_xmit(cl);
979}
980
971static int ssip_pn_xmit(struct sk_buff *skb, struct net_device *dev) 981static int ssip_pn_xmit(struct sk_buff *skb, struct net_device *dev)
972{ 982{
973 struct hsi_client *cl = to_hsi_client(dev->dev.parent); 983 struct hsi_client *cl = to_hsi_client(dev->dev.parent);
@@ -1020,7 +1030,7 @@ static int ssip_pn_xmit(struct sk_buff *skb, struct net_device *dev)
1020 dev_dbg(&cl->device, "Start TX on SEND READY qlen %d\n", 1030 dev_dbg(&cl->device, "Start TX on SEND READY qlen %d\n",
1021 ssi->txqueue_len); 1031 ssi->txqueue_len);
1022 spin_unlock_bh(&ssi->lock); 1032 spin_unlock_bh(&ssi->lock);
1023 ssip_xmit(cl); 1033 schedule_work(&ssi->work);
1024 } else { 1034 } else {
1025 spin_unlock_bh(&ssi->lock); 1035 spin_unlock_bh(&ssi->lock);
1026 } 1036 }
@@ -1097,6 +1107,7 @@ static int ssi_protocol_probe(struct device *dev)
1097 atomic_set(&ssi->tx_usecnt, 0); 1107 atomic_set(&ssi->tx_usecnt, 0);
1098 hsi_client_set_drvdata(cl, ssi); 1108 hsi_client_set_drvdata(cl, ssi);
1099 ssi->cl = cl; 1109 ssi->cl = cl;
1110 INIT_WORK(&ssi->work, ssip_xmit_work);
1100 1111
1101 ssi->channel_id_cmd = hsi_get_channel_id_by_name(cl, "mcsaab-control"); 1112 ssi->channel_id_cmd = hsi_get_channel_id_by_name(cl, "mcsaab-control");
1102 if (ssi->channel_id_cmd < 0) { 1113 if (ssi->channel_id_cmd < 0) {