.. | .. |
---|
412 | 412 | |
---|
413 | 413 | rc = device_register(dev); |
---|
414 | 414 | if (rc) { |
---|
415 | | - kfree(client_dev); |
---|
| 415 | + put_device(dev); |
---|
416 | 416 | goto err; |
---|
417 | 417 | } |
---|
418 | 418 | |
---|
.. | .. |
---|
911 | 911 | return 0; |
---|
912 | 912 | } |
---|
913 | 913 | |
---|
914 | | -static void ntb_qp_link_down_reset(struct ntb_transport_qp *qp) |
---|
| 914 | +static void ntb_qp_link_context_reset(struct ntb_transport_qp *qp) |
---|
915 | 915 | { |
---|
916 | 916 | qp->link_is_up = false; |
---|
917 | 917 | qp->active = false; |
---|
.. | .. |
---|
932 | 932 | qp->tx_err_no_buf = 0; |
---|
933 | 933 | qp->tx_memcpy = 0; |
---|
934 | 934 | qp->tx_async = 0; |
---|
| 935 | +} |
---|
| 936 | + |
---|
| 937 | +static void ntb_qp_link_down_reset(struct ntb_transport_qp *qp) |
---|
| 938 | +{ |
---|
| 939 | + ntb_qp_link_context_reset(qp); |
---|
| 940 | + if (qp->remote_rx_info) |
---|
| 941 | + qp->remote_rx_info->entry = qp->rx_max_entry - 1; |
---|
935 | 942 | } |
---|
936 | 943 | |
---|
937 | 944 | static void ntb_qp_link_cleanup(struct ntb_transport_qp *qp) |
---|
.. | .. |
---|
1176 | 1183 | qp->ndev = nt->ndev; |
---|
1177 | 1184 | qp->client_ready = false; |
---|
1178 | 1185 | qp->event_handler = NULL; |
---|
1179 | | - ntb_qp_link_down_reset(qp); |
---|
| 1186 | + ntb_qp_link_context_reset(qp); |
---|
1180 | 1187 | |
---|
1181 | 1188 | if (mw_num < qp_count % mw_count) |
---|
1182 | 1189 | num_qps_mw = qp_count / mw_count + 1; |
---|
.. | .. |
---|
2278 | 2285 | struct ntb_queue_entry *entry; |
---|
2279 | 2286 | int rc; |
---|
2280 | 2287 | |
---|
2281 | | - if (!qp || !qp->link_is_up || !len) |
---|
| 2288 | + if (!qp || !len) |
---|
2282 | 2289 | return -EINVAL; |
---|
| 2290 | + |
---|
| 2291 | + /* If the qp link is down already, just ignore. */ |
---|
| 2292 | + if (!qp->link_is_up) |
---|
| 2293 | + return 0; |
---|
2283 | 2294 | |
---|
2284 | 2295 | entry = ntb_list_rm(&qp->ntb_tx_free_q_lock, &qp->tx_free_q); |
---|
2285 | 2296 | if (!entry) { |
---|
.. | .. |
---|
2420 | 2431 | unsigned int head = qp->tx_index; |
---|
2421 | 2432 | unsigned int tail = qp->remote_rx_info->entry; |
---|
2422 | 2433 | |
---|
2423 | | - return tail > head ? tail - head : qp->tx_max_entry + tail - head; |
---|
| 2434 | + return tail >= head ? tail - head : qp->tx_max_entry + tail - head; |
---|
2424 | 2435 | } |
---|
2425 | 2436 | EXPORT_SYMBOL_GPL(ntb_transport_tx_free_entry); |
---|
2426 | 2437 | |
---|