| .. | .. |
|---|
| 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 | |
|---|