.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
---|
1 | 2 | /* |
---|
2 | 3 | * rrunner.c: Linux driver for the Essential RoadRunner HIPPI board. |
---|
3 | 4 | * |
---|
.. | .. |
---|
8 | 9 | * been able to write this driver. A special thank you to John Gibbon |
---|
9 | 10 | * for sorting out the legal issues, with the NDA, allowing the code to |
---|
10 | 11 | * be released under the GPL. |
---|
11 | | - * |
---|
12 | | - * This program is free software; you can redistribute it and/or modify |
---|
13 | | - * it under the terms of the GNU General Public License as published by |
---|
14 | | - * the Free Software Foundation; either version 2 of the License, or |
---|
15 | | - * (at your option) any later version. |
---|
16 | 12 | * |
---|
17 | 13 | * Thanks to Jayaram Bhat from ODS/Essential for fixing some of the |
---|
18 | 14 | * stupid bugs in my code. |
---|
.. | .. |
---|
155 | 151 | goto out; |
---|
156 | 152 | } |
---|
157 | 153 | |
---|
158 | | - tmpptr = pci_alloc_consistent(pdev, TX_TOTAL_SIZE, &ring_dma); |
---|
| 154 | + tmpptr = dma_alloc_coherent(&pdev->dev, TX_TOTAL_SIZE, &ring_dma, |
---|
| 155 | + GFP_KERNEL); |
---|
159 | 156 | rrpriv->tx_ring = tmpptr; |
---|
160 | 157 | rrpriv->tx_ring_dma = ring_dma; |
---|
161 | 158 | |
---|
.. | .. |
---|
164 | 161 | goto out; |
---|
165 | 162 | } |
---|
166 | 163 | |
---|
167 | | - tmpptr = pci_alloc_consistent(pdev, RX_TOTAL_SIZE, &ring_dma); |
---|
| 164 | + tmpptr = dma_alloc_coherent(&pdev->dev, RX_TOTAL_SIZE, &ring_dma, |
---|
| 165 | + GFP_KERNEL); |
---|
168 | 166 | rrpriv->rx_ring = tmpptr; |
---|
169 | 167 | rrpriv->rx_ring_dma = ring_dma; |
---|
170 | 168 | |
---|
.. | .. |
---|
173 | 171 | goto out; |
---|
174 | 172 | } |
---|
175 | 173 | |
---|
176 | | - tmpptr = pci_alloc_consistent(pdev, EVT_RING_SIZE, &ring_dma); |
---|
| 174 | + tmpptr = dma_alloc_coherent(&pdev->dev, EVT_RING_SIZE, &ring_dma, |
---|
| 175 | + GFP_KERNEL); |
---|
177 | 176 | rrpriv->evt_ring = tmpptr; |
---|
178 | 177 | rrpriv->evt_ring_dma = ring_dma; |
---|
179 | 178 | |
---|
.. | .. |
---|
202 | 201 | |
---|
203 | 202 | out: |
---|
204 | 203 | if (rrpriv->evt_ring) |
---|
205 | | - pci_free_consistent(pdev, EVT_RING_SIZE, rrpriv->evt_ring, |
---|
206 | | - rrpriv->evt_ring_dma); |
---|
| 204 | + dma_free_coherent(&pdev->dev, EVT_RING_SIZE, rrpriv->evt_ring, |
---|
| 205 | + rrpriv->evt_ring_dma); |
---|
207 | 206 | if (rrpriv->rx_ring) |
---|
208 | | - pci_free_consistent(pdev, RX_TOTAL_SIZE, rrpriv->rx_ring, |
---|
209 | | - rrpriv->rx_ring_dma); |
---|
| 207 | + dma_free_coherent(&pdev->dev, RX_TOTAL_SIZE, rrpriv->rx_ring, |
---|
| 208 | + rrpriv->rx_ring_dma); |
---|
210 | 209 | if (rrpriv->tx_ring) |
---|
211 | | - pci_free_consistent(pdev, TX_TOTAL_SIZE, rrpriv->tx_ring, |
---|
212 | | - rrpriv->tx_ring_dma); |
---|
| 210 | + dma_free_coherent(&pdev->dev, TX_TOTAL_SIZE, rrpriv->tx_ring, |
---|
| 211 | + rrpriv->tx_ring_dma); |
---|
213 | 212 | if (rrpriv->regs) |
---|
214 | 213 | pci_iounmap(pdev, rrpriv->regs); |
---|
215 | 214 | if (pdev) |
---|
.. | .. |
---|
232 | 231 | } |
---|
233 | 232 | |
---|
234 | 233 | unregister_netdev(dev); |
---|
235 | | - pci_free_consistent(pdev, EVT_RING_SIZE, rr->evt_ring, |
---|
236 | | - rr->evt_ring_dma); |
---|
237 | | - pci_free_consistent(pdev, RX_TOTAL_SIZE, rr->rx_ring, |
---|
238 | | - rr->rx_ring_dma); |
---|
239 | | - pci_free_consistent(pdev, TX_TOTAL_SIZE, rr->tx_ring, |
---|
240 | | - rr->tx_ring_dma); |
---|
| 234 | + dma_free_coherent(&pdev->dev, EVT_RING_SIZE, rr->evt_ring, |
---|
| 235 | + rr->evt_ring_dma); |
---|
| 236 | + dma_free_coherent(&pdev->dev, RX_TOTAL_SIZE, rr->rx_ring, |
---|
| 237 | + rr->rx_ring_dma); |
---|
| 238 | + dma_free_coherent(&pdev->dev, TX_TOTAL_SIZE, rr->tx_ring, |
---|
| 239 | + rr->tx_ring_dma); |
---|
241 | 240 | pci_iounmap(pdev, rr->regs); |
---|
242 | 241 | pci_release_regions(pdev); |
---|
243 | 242 | pci_disable_device(pdev); |
---|
.. | .. |
---|
652 | 651 | goto error; |
---|
653 | 652 | } |
---|
654 | 653 | rrpriv->rx_skbuff[i] = skb; |
---|
655 | | - addr = pci_map_single(rrpriv->pci_dev, skb->data, |
---|
656 | | - dev->mtu + HIPPI_HLEN, PCI_DMA_FROMDEVICE); |
---|
| 654 | + addr = dma_map_single(&rrpriv->pci_dev->dev, skb->data, |
---|
| 655 | + dev->mtu + HIPPI_HLEN, DMA_FROM_DEVICE); |
---|
657 | 656 | /* |
---|
658 | 657 | * Sanity test to see if we conflict with the DMA |
---|
659 | 658 | * limitations of the Roadrunner. |
---|
.. | .. |
---|
703 | 702 | struct sk_buff *skb = rrpriv->rx_skbuff[i]; |
---|
704 | 703 | |
---|
705 | 704 | if (skb) { |
---|
706 | | - pci_unmap_single(rrpriv->pci_dev, |
---|
| 705 | + dma_unmap_single(&rrpriv->pci_dev->dev, |
---|
707 | 706 | rrpriv->rx_ring[i].addr.addrlo, |
---|
708 | 707 | dev->mtu + HIPPI_HLEN, |
---|
709 | | - PCI_DMA_FROMDEVICE); |
---|
| 708 | + DMA_FROM_DEVICE); |
---|
710 | 709 | rrpriv->rx_ring[i].size = 0; |
---|
711 | 710 | set_rraddr(&rrpriv->rx_ring[i].addr, 0); |
---|
712 | 711 | dev_kfree_skb(skb); |
---|
.. | .. |
---|
957 | 956 | dev->stats.rx_dropped++; |
---|
958 | 957 | goto defer; |
---|
959 | 958 | } else { |
---|
960 | | - pci_dma_sync_single_for_cpu(rrpriv->pci_dev, |
---|
961 | | - desc->addr.addrlo, |
---|
962 | | - pkt_len, |
---|
963 | | - PCI_DMA_FROMDEVICE); |
---|
| 959 | + dma_sync_single_for_cpu(&rrpriv->pci_dev->dev, |
---|
| 960 | + desc->addr.addrlo, |
---|
| 961 | + pkt_len, |
---|
| 962 | + DMA_FROM_DEVICE); |
---|
964 | 963 | |
---|
965 | 964 | skb_put_data(skb, rx_skb->data, |
---|
966 | 965 | pkt_len); |
---|
967 | 966 | |
---|
968 | | - pci_dma_sync_single_for_device(rrpriv->pci_dev, |
---|
969 | | - desc->addr.addrlo, |
---|
970 | | - pkt_len, |
---|
971 | | - PCI_DMA_FROMDEVICE); |
---|
| 967 | + dma_sync_single_for_device(&rrpriv->pci_dev->dev, |
---|
| 968 | + desc->addr.addrlo, |
---|
| 969 | + pkt_len, |
---|
| 970 | + DMA_FROM_DEVICE); |
---|
972 | 971 | } |
---|
973 | 972 | }else{ |
---|
974 | 973 | struct sk_buff *newskb; |
---|
.. | .. |
---|
978 | 977 | if (newskb){ |
---|
979 | 978 | dma_addr_t addr; |
---|
980 | 979 | |
---|
981 | | - pci_unmap_single(rrpriv->pci_dev, |
---|
982 | | - desc->addr.addrlo, dev->mtu + |
---|
983 | | - HIPPI_HLEN, PCI_DMA_FROMDEVICE); |
---|
| 980 | + dma_unmap_single(&rrpriv->pci_dev->dev, |
---|
| 981 | + desc->addr.addrlo, |
---|
| 982 | + dev->mtu + HIPPI_HLEN, |
---|
| 983 | + DMA_FROM_DEVICE); |
---|
984 | 984 | skb = rx_skb; |
---|
985 | 985 | skb_put(skb, pkt_len); |
---|
986 | 986 | rrpriv->rx_skbuff[index] = newskb; |
---|
987 | | - addr = pci_map_single(rrpriv->pci_dev, |
---|
988 | | - newskb->data, |
---|
989 | | - dev->mtu + HIPPI_HLEN, |
---|
990 | | - PCI_DMA_FROMDEVICE); |
---|
| 987 | + addr = dma_map_single(&rrpriv->pci_dev->dev, |
---|
| 988 | + newskb->data, |
---|
| 989 | + dev->mtu + HIPPI_HLEN, |
---|
| 990 | + DMA_FROM_DEVICE); |
---|
991 | 991 | set_rraddr(&desc->addr, addr); |
---|
992 | 992 | } else { |
---|
993 | 993 | printk("%s: Out of memory, deferring " |
---|
.. | .. |
---|
1072 | 1072 | dev->stats.tx_packets++; |
---|
1073 | 1073 | dev->stats.tx_bytes += skb->len; |
---|
1074 | 1074 | |
---|
1075 | | - pci_unmap_single(rrpriv->pci_dev, |
---|
| 1075 | + dma_unmap_single(&rrpriv->pci_dev->dev, |
---|
1076 | 1076 | desc->addr.addrlo, skb->len, |
---|
1077 | | - PCI_DMA_TODEVICE); |
---|
| 1077 | + DMA_TO_DEVICE); |
---|
1078 | 1078 | dev_kfree_skb_irq(skb); |
---|
1079 | 1079 | |
---|
1080 | 1080 | rrpriv->tx_skbuff[txcon] = NULL; |
---|
.. | .. |
---|
1114 | 1114 | if (skb) { |
---|
1115 | 1115 | struct tx_desc *desc = &(rrpriv->tx_ring[i]); |
---|
1116 | 1116 | |
---|
1117 | | - pci_unmap_single(rrpriv->pci_dev, desc->addr.addrlo, |
---|
1118 | | - skb->len, PCI_DMA_TODEVICE); |
---|
| 1117 | + dma_unmap_single(&rrpriv->pci_dev->dev, |
---|
| 1118 | + desc->addr.addrlo, skb->len, |
---|
| 1119 | + DMA_TO_DEVICE); |
---|
1119 | 1120 | desc->size = 0; |
---|
1120 | 1121 | set_rraddr(&desc->addr, 0); |
---|
1121 | 1122 | dev_kfree_skb(skb); |
---|
.. | .. |
---|
1136 | 1137 | if (skb) { |
---|
1137 | 1138 | struct rx_desc *desc = &(rrpriv->rx_ring[i]); |
---|
1138 | 1139 | |
---|
1139 | | - pci_unmap_single(rrpriv->pci_dev, desc->addr.addrlo, |
---|
1140 | | - dev->mtu + HIPPI_HLEN, PCI_DMA_FROMDEVICE); |
---|
| 1140 | + dma_unmap_single(&rrpriv->pci_dev->dev, |
---|
| 1141 | + desc->addr.addrlo, |
---|
| 1142 | + dev->mtu + HIPPI_HLEN, |
---|
| 1143 | + DMA_FROM_DEVICE); |
---|
1141 | 1144 | desc->size = 0; |
---|
1142 | 1145 | set_rraddr(&desc->addr, 0); |
---|
1143 | 1146 | dev_kfree_skb(skb); |
---|
.. | .. |
---|
1192 | 1195 | goto error; |
---|
1193 | 1196 | } |
---|
1194 | 1197 | |
---|
1195 | | - rrpriv->rx_ctrl = pci_alloc_consistent(pdev, |
---|
1196 | | - 256 * sizeof(struct ring_ctrl), |
---|
1197 | | - &dma_addr); |
---|
| 1198 | + rrpriv->rx_ctrl = dma_alloc_coherent(&pdev->dev, |
---|
| 1199 | + 256 * sizeof(struct ring_ctrl), |
---|
| 1200 | + &dma_addr, GFP_KERNEL); |
---|
1198 | 1201 | if (!rrpriv->rx_ctrl) { |
---|
1199 | 1202 | ecode = -ENOMEM; |
---|
1200 | 1203 | goto error; |
---|
1201 | 1204 | } |
---|
1202 | 1205 | rrpriv->rx_ctrl_dma = dma_addr; |
---|
1203 | | - memset(rrpriv->rx_ctrl, 0, 256*sizeof(struct ring_ctrl)); |
---|
1204 | 1206 | |
---|
1205 | | - rrpriv->info = pci_alloc_consistent(pdev, sizeof(struct rr_info), |
---|
1206 | | - &dma_addr); |
---|
| 1207 | + rrpriv->info = dma_alloc_coherent(&pdev->dev, sizeof(struct rr_info), |
---|
| 1208 | + &dma_addr, GFP_KERNEL); |
---|
1207 | 1209 | if (!rrpriv->info) { |
---|
1208 | 1210 | ecode = -ENOMEM; |
---|
1209 | 1211 | goto error; |
---|
1210 | 1212 | } |
---|
1211 | 1213 | rrpriv->info_dma = dma_addr; |
---|
1212 | | - memset(rrpriv->info, 0, sizeof(struct rr_info)); |
---|
1213 | 1214 | wmb(); |
---|
1214 | 1215 | |
---|
1215 | 1216 | spin_lock_irqsave(&rrpriv->lock, flags); |
---|
.. | .. |
---|
1243 | 1244 | spin_unlock_irqrestore(&rrpriv->lock, flags); |
---|
1244 | 1245 | |
---|
1245 | 1246 | if (rrpriv->info) { |
---|
1246 | | - pci_free_consistent(pdev, sizeof(struct rr_info), rrpriv->info, |
---|
1247 | | - rrpriv->info_dma); |
---|
| 1247 | + dma_free_coherent(&pdev->dev, sizeof(struct rr_info), |
---|
| 1248 | + rrpriv->info, rrpriv->info_dma); |
---|
1248 | 1249 | rrpriv->info = NULL; |
---|
1249 | 1250 | } |
---|
1250 | 1251 | if (rrpriv->rx_ctrl) { |
---|
1251 | | - pci_free_consistent(pdev, 256 * sizeof(struct ring_ctrl), |
---|
1252 | | - rrpriv->rx_ctrl, rrpriv->rx_ctrl_dma); |
---|
| 1252 | + dma_free_coherent(&pdev->dev, 256 * sizeof(struct ring_ctrl), |
---|
| 1253 | + rrpriv->rx_ctrl, rrpriv->rx_ctrl_dma); |
---|
1253 | 1254 | rrpriv->rx_ctrl = NULL; |
---|
1254 | 1255 | } |
---|
1255 | 1256 | |
---|
.. | .. |
---|
1298 | 1299 | if (rrpriv->tx_skbuff[cons]){ |
---|
1299 | 1300 | len = min_t(int, 0x80, rrpriv->tx_skbuff[cons]->len); |
---|
1300 | 1301 | printk("skbuff for cons %i is valid - dumping data (0x%x bytes - skbuff len 0x%x)\n", cons, len, rrpriv->tx_skbuff[cons]->len); |
---|
1301 | | - printk("mode 0x%x, size 0x%x,\n phys %08Lx, skbuff-addr %08lx, truesize 0x%x\n", |
---|
| 1302 | + printk("mode 0x%x, size 0x%x,\n phys %08Lx, skbuff-addr %p, truesize 0x%x\n", |
---|
1302 | 1303 | rrpriv->tx_ring[cons].mode, |
---|
1303 | 1304 | rrpriv->tx_ring[cons].size, |
---|
1304 | 1305 | (unsigned long long) rrpriv->tx_ring[cons].addr.addrlo, |
---|
1305 | | - (unsigned long)rrpriv->tx_skbuff[cons]->data, |
---|
| 1306 | + rrpriv->tx_skbuff[cons]->data, |
---|
1306 | 1307 | (unsigned int)rrpriv->tx_skbuff[cons]->truesize); |
---|
1307 | 1308 | for (i = 0; i < len; i++){ |
---|
1308 | 1309 | if (!(i & 7)) |
---|
.. | .. |
---|
1352 | 1353 | |
---|
1353 | 1354 | rrpriv->fw_running = 0; |
---|
1354 | 1355 | |
---|
| 1356 | + spin_unlock_irqrestore(&rrpriv->lock, flags); |
---|
1355 | 1357 | del_timer_sync(&rrpriv->timer); |
---|
| 1358 | + spin_lock_irqsave(&rrpriv->lock, flags); |
---|
1356 | 1359 | |
---|
1357 | 1360 | writel(0, ®s->TxPi); |
---|
1358 | 1361 | writel(0, ®s->IpRxPi); |
---|
.. | .. |
---|
1371 | 1374 | rr_raz_tx(rrpriv, dev); |
---|
1372 | 1375 | rr_raz_rx(rrpriv, dev); |
---|
1373 | 1376 | |
---|
1374 | | - pci_free_consistent(pdev, 256 * sizeof(struct ring_ctrl), |
---|
1375 | | - rrpriv->rx_ctrl, rrpriv->rx_ctrl_dma); |
---|
| 1377 | + dma_free_coherent(&pdev->dev, 256 * sizeof(struct ring_ctrl), |
---|
| 1378 | + rrpriv->rx_ctrl, rrpriv->rx_ctrl_dma); |
---|
1376 | 1379 | rrpriv->rx_ctrl = NULL; |
---|
1377 | 1380 | |
---|
1378 | | - pci_free_consistent(pdev, sizeof(struct rr_info), rrpriv->info, |
---|
1379 | | - rrpriv->info_dma); |
---|
| 1381 | + dma_free_coherent(&pdev->dev, sizeof(struct rr_info), rrpriv->info, |
---|
| 1382 | + rrpriv->info_dma); |
---|
1380 | 1383 | rrpriv->info = NULL; |
---|
1381 | 1384 | |
---|
1382 | 1385 | spin_unlock_irqrestore(&rrpriv->lock, flags); |
---|
.. | .. |
---|
1436 | 1439 | index = txctrl->pi; |
---|
1437 | 1440 | |
---|
1438 | 1441 | rrpriv->tx_skbuff[index] = skb; |
---|
1439 | | - set_rraddr(&rrpriv->tx_ring[index].addr, pci_map_single( |
---|
1440 | | - rrpriv->pci_dev, skb->data, len + 8, PCI_DMA_TODEVICE)); |
---|
| 1442 | + set_rraddr(&rrpriv->tx_ring[index].addr, |
---|
| 1443 | + dma_map_single(&rrpriv->pci_dev->dev, skb->data, len + 8, DMA_TO_DEVICE)); |
---|
1441 | 1444 | rrpriv->tx_ring[index].size = len + 8; /* include IFIELD */ |
---|
1442 | 1445 | rrpriv->tx_ring[index].mode = PACKET_START | PACKET_END; |
---|
1443 | 1446 | txctrl->pi = (index + 1) % TX_RING_ENTRIES; |
---|