Commit 1959031e authored by David S. Miller's avatar David S. Miller

Merge branch 's390-qeth-fixes'

Julian Wiedmann says:

====================
s390/qeth: fixes 2018-03-20

Please apply one final set of qeth patches for 4.16.
All of these fix long-standing bugs, so please queue them up for -stable
as well.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 3d21ac6f a6c3d939
...@@ -527,8 +527,7 @@ static inline int qeth_is_cq(struct qeth_card *card, unsigned int queue) ...@@ -527,8 +527,7 @@ static inline int qeth_is_cq(struct qeth_card *card, unsigned int queue)
queue == card->qdio.no_in_queues - 1; queue == card->qdio.no_in_queues - 1;
} }
static int __qeth_issue_next_read(struct qeth_card *card)
static int qeth_issue_next_read(struct qeth_card *card)
{ {
int rc; int rc;
struct qeth_cmd_buffer *iob; struct qeth_cmd_buffer *iob;
...@@ -559,6 +558,17 @@ static int qeth_issue_next_read(struct qeth_card *card) ...@@ -559,6 +558,17 @@ static int qeth_issue_next_read(struct qeth_card *card)
return rc; return rc;
} }
static int qeth_issue_next_read(struct qeth_card *card)
{
int ret;
spin_lock_irq(get_ccwdev_lock(CARD_RDEV(card)));
ret = __qeth_issue_next_read(card);
spin_unlock_irq(get_ccwdev_lock(CARD_RDEV(card)));
return ret;
}
static struct qeth_reply *qeth_alloc_reply(struct qeth_card *card) static struct qeth_reply *qeth_alloc_reply(struct qeth_card *card)
{ {
struct qeth_reply *reply; struct qeth_reply *reply;
...@@ -960,7 +970,7 @@ void qeth_clear_thread_running_bit(struct qeth_card *card, unsigned long thread) ...@@ -960,7 +970,7 @@ void qeth_clear_thread_running_bit(struct qeth_card *card, unsigned long thread)
spin_lock_irqsave(&card->thread_mask_lock, flags); spin_lock_irqsave(&card->thread_mask_lock, flags);
card->thread_running_mask &= ~thread; card->thread_running_mask &= ~thread;
spin_unlock_irqrestore(&card->thread_mask_lock, flags); spin_unlock_irqrestore(&card->thread_mask_lock, flags);
wake_up(&card->wait_q); wake_up_all(&card->wait_q);
} }
EXPORT_SYMBOL_GPL(qeth_clear_thread_running_bit); EXPORT_SYMBOL_GPL(qeth_clear_thread_running_bit);
...@@ -1164,6 +1174,7 @@ static void qeth_irq(struct ccw_device *cdev, unsigned long intparm, ...@@ -1164,6 +1174,7 @@ static void qeth_irq(struct ccw_device *cdev, unsigned long intparm,
} }
rc = qeth_get_problem(cdev, irb); rc = qeth_get_problem(cdev, irb);
if (rc) { if (rc) {
card->read_or_write_problem = 1;
qeth_clear_ipacmd_list(card); qeth_clear_ipacmd_list(card);
qeth_schedule_recovery(card); qeth_schedule_recovery(card);
goto out; goto out;
...@@ -1182,7 +1193,7 @@ static void qeth_irq(struct ccw_device *cdev, unsigned long intparm, ...@@ -1182,7 +1193,7 @@ static void qeth_irq(struct ccw_device *cdev, unsigned long intparm,
return; return;
if (channel == &card->read && if (channel == &card->read &&
channel->state == CH_STATE_UP) channel->state == CH_STATE_UP)
qeth_issue_next_read(card); __qeth_issue_next_read(card);
iob = channel->iob; iob = channel->iob;
index = channel->buf_no; index = channel->buf_no;
...@@ -5087,8 +5098,6 @@ static void qeth_core_free_card(struct qeth_card *card) ...@@ -5087,8 +5098,6 @@ static void qeth_core_free_card(struct qeth_card *card)
QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
qeth_clean_channel(&card->read); qeth_clean_channel(&card->read);
qeth_clean_channel(&card->write); qeth_clean_channel(&card->write);
if (card->dev)
free_netdev(card->dev);
qeth_free_qdio_buffers(card); qeth_free_qdio_buffers(card);
unregister_service_level(&card->qeth_service_level); unregister_service_level(&card->qeth_service_level);
kfree(card); kfree(card);
......
...@@ -915,8 +915,8 @@ static void qeth_l2_remove_device(struct ccwgroup_device *cgdev) ...@@ -915,8 +915,8 @@ static void qeth_l2_remove_device(struct ccwgroup_device *cgdev)
qeth_l2_set_offline(cgdev); qeth_l2_set_offline(cgdev);
if (card->dev) { if (card->dev) {
netif_napi_del(&card->napi);
unregister_netdev(card->dev); unregister_netdev(card->dev);
free_netdev(card->dev);
card->dev = NULL; card->dev = NULL;
} }
return; return;
......
...@@ -2865,8 +2865,8 @@ static void qeth_l3_remove_device(struct ccwgroup_device *cgdev) ...@@ -2865,8 +2865,8 @@ static void qeth_l3_remove_device(struct ccwgroup_device *cgdev)
qeth_l3_set_offline(cgdev); qeth_l3_set_offline(cgdev);
if (card->dev) { if (card->dev) {
netif_napi_del(&card->napi);
unregister_netdev(card->dev); unregister_netdev(card->dev);
free_netdev(card->dev);
card->dev = NULL; card->dev = NULL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment