diff options
author | Sebastian Reichel <sre@kernel.org> | 2016-06-17 18:58:39 -0400 |
---|---|---|
committer | Sebastian Reichel <sre@kernel.org> | 2016-06-27 18:38:37 -0400 |
commit | df26d639e2f4628732a8da5a0f71e4e652ce809b (patch) | |
tree | b53db2bdb9b8799b662b2b967d2bf22a74d61f59 | |
parent | 866dcb9d57fcad11c2647a154b2b246ac10d0795 (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.c | 13 |
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 | ||
972 | static 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 | |||
971 | static int ssip_pn_xmit(struct sk_buff *skb, struct net_device *dev) | 981 | static 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) { |