diff options
| -rw-r--r-- | drivers/net/ethernet/amd/xgbe/xgbe-common.h | 8 | ||||
| -rw-r--r-- | drivers/net/ethernet/amd/xgbe/xgbe-desc.c | 176 | ||||
| -rw-r--r-- | drivers/net/ethernet/amd/xgbe/xgbe-dev.c | 44 | ||||
| -rw-r--r-- | drivers/net/ethernet/amd/xgbe/xgbe-drv.c | 63 | ||||
| -rw-r--r-- | drivers/net/ethernet/amd/xgbe/xgbe.h | 21 |
5 files changed, 201 insertions, 111 deletions
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-common.h b/drivers/net/ethernet/amd/xgbe/xgbe-common.h index caade30820d5..39bcb1140198 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-common.h +++ b/drivers/net/ethernet/amd/xgbe/xgbe-common.h | |||
| @@ -207,6 +207,8 @@ | |||
| 207 | /* DMA channel register entry bit positions and sizes */ | 207 | /* DMA channel register entry bit positions and sizes */ |
| 208 | #define DMA_CH_CR_PBLX8_INDEX 16 | 208 | #define DMA_CH_CR_PBLX8_INDEX 16 |
| 209 | #define DMA_CH_CR_PBLX8_WIDTH 1 | 209 | #define DMA_CH_CR_PBLX8_WIDTH 1 |
| 210 | #define DMA_CH_CR_SPH_INDEX 24 | ||
| 211 | #define DMA_CH_CR_SPH_WIDTH 1 | ||
| 210 | #define DMA_CH_IER_AIE_INDEX 15 | 212 | #define DMA_CH_IER_AIE_INDEX 15 |
| 211 | #define DMA_CH_IER_AIE_WIDTH 1 | 213 | #define DMA_CH_IER_AIE_WIDTH 1 |
| 212 | #define DMA_CH_IER_FBEE_INDEX 12 | 214 | #define DMA_CH_IER_FBEE_INDEX 12 |
| @@ -429,6 +431,8 @@ | |||
| 429 | #define MAC_RCR_CST_WIDTH 1 | 431 | #define MAC_RCR_CST_WIDTH 1 |
| 430 | #define MAC_RCR_DCRCC_INDEX 3 | 432 | #define MAC_RCR_DCRCC_INDEX 3 |
| 431 | #define MAC_RCR_DCRCC_WIDTH 1 | 433 | #define MAC_RCR_DCRCC_WIDTH 1 |
| 434 | #define MAC_RCR_HDSMS_INDEX 12 | ||
| 435 | #define MAC_RCR_HDSMS_WIDTH 3 | ||
| 432 | #define MAC_RCR_IPC_INDEX 9 | 436 | #define MAC_RCR_IPC_INDEX 9 |
| 433 | #define MAC_RCR_IPC_WIDTH 1 | 437 | #define MAC_RCR_IPC_WIDTH 1 |
| 434 | #define MAC_RCR_JE_INDEX 8 | 438 | #define MAC_RCR_JE_INDEX 8 |
| @@ -847,6 +851,8 @@ | |||
| 847 | 851 | ||
| 848 | #define RX_NORMAL_DESC0_OVT_INDEX 0 | 852 | #define RX_NORMAL_DESC0_OVT_INDEX 0 |
| 849 | #define RX_NORMAL_DESC0_OVT_WIDTH 16 | 853 | #define RX_NORMAL_DESC0_OVT_WIDTH 16 |
| 854 | #define RX_NORMAL_DESC2_HL_INDEX 0 | ||
| 855 | #define RX_NORMAL_DESC2_HL_WIDTH 10 | ||
| 850 | #define RX_NORMAL_DESC3_CDA_INDEX 27 | 856 | #define RX_NORMAL_DESC3_CDA_INDEX 27 |
| 851 | #define RX_NORMAL_DESC3_CDA_WIDTH 1 | 857 | #define RX_NORMAL_DESC3_CDA_WIDTH 1 |
| 852 | #define RX_NORMAL_DESC3_CTXT_INDEX 30 | 858 | #define RX_NORMAL_DESC3_CTXT_INDEX 30 |
| @@ -855,6 +861,8 @@ | |||
| 855 | #define RX_NORMAL_DESC3_ES_WIDTH 1 | 861 | #define RX_NORMAL_DESC3_ES_WIDTH 1 |
| 856 | #define RX_NORMAL_DESC3_ETLT_INDEX 16 | 862 | #define RX_NORMAL_DESC3_ETLT_INDEX 16 |
| 857 | #define RX_NORMAL_DESC3_ETLT_WIDTH 4 | 863 | #define RX_NORMAL_DESC3_ETLT_WIDTH 4 |
| 864 | #define RX_NORMAL_DESC3_FD_INDEX 29 | ||
| 865 | #define RX_NORMAL_DESC3_FD_WIDTH 1 | ||
| 858 | #define RX_NORMAL_DESC3_INTE_INDEX 30 | 866 | #define RX_NORMAL_DESC3_INTE_INDEX 30 |
| 859 | #define RX_NORMAL_DESC3_INTE_WIDTH 1 | 867 | #define RX_NORMAL_DESC3_INTE_WIDTH 1 |
| 860 | #define RX_NORMAL_DESC3_LD_INDEX 28 | 868 | #define RX_NORMAL_DESC3_LD_INDEX 28 |
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-desc.c b/drivers/net/ethernet/amd/xgbe/xgbe-desc.c index 99911f45f334..e6b9f54b9697 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-desc.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-desc.c | |||
| @@ -138,15 +138,26 @@ static void xgbe_free_ring(struct xgbe_prv_data *pdata, | |||
| 138 | ring->rdata = NULL; | 138 | ring->rdata = NULL; |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | if (ring->rx_pa.pages) { | 141 | if (ring->rx_hdr_pa.pages) { |
| 142 | dma_unmap_page(pdata->dev, ring->rx_pa.pages_dma, | 142 | dma_unmap_page(pdata->dev, ring->rx_hdr_pa.pages_dma, |
| 143 | ring->rx_pa.pages_len, DMA_FROM_DEVICE); | 143 | ring->rx_hdr_pa.pages_len, DMA_FROM_DEVICE); |
| 144 | put_page(ring->rx_pa.pages); | 144 | put_page(ring->rx_hdr_pa.pages); |
| 145 | 145 | ||
| 146 | ring->rx_pa.pages = NULL; | 146 | ring->rx_hdr_pa.pages = NULL; |
| 147 | ring->rx_pa.pages_len = 0; | 147 | ring->rx_hdr_pa.pages_len = 0; |
| 148 | ring->rx_pa.pages_offset = 0; | 148 | ring->rx_hdr_pa.pages_offset = 0; |
| 149 | ring->rx_pa.pages_dma = 0; | 149 | ring->rx_hdr_pa.pages_dma = 0; |
| 150 | } | ||
| 151 | |||
| 152 | if (ring->rx_buf_pa.pages) { | ||
| 153 | dma_unmap_page(pdata->dev, ring->rx_buf_pa.pages_dma, | ||
| 154 | ring->rx_buf_pa.pages_len, DMA_FROM_DEVICE); | ||
| 155 | put_page(ring->rx_buf_pa.pages); | ||
| 156 | |||
| 157 | ring->rx_buf_pa.pages = NULL; | ||
| 158 | ring->rx_buf_pa.pages_len = 0; | ||
| 159 | ring->rx_buf_pa.pages_offset = 0; | ||
| 160 | ring->rx_buf_pa.pages_dma = 0; | ||
| 150 | } | 161 | } |
| 151 | 162 | ||
| 152 | if (ring->rdesc) { | 163 | if (ring->rdesc) { |
| @@ -244,62 +255,93 @@ err_ring: | |||
| 244 | return ret; | 255 | return ret; |
| 245 | } | 256 | } |
| 246 | 257 | ||
| 247 | static int xgbe_map_rx_buffer(struct xgbe_prv_data *pdata, | 258 | static int xgbe_alloc_pages(struct xgbe_prv_data *pdata, |
| 248 | struct xgbe_ring *ring, | 259 | struct xgbe_page_alloc *pa, gfp_t gfp, int order) |
| 249 | struct xgbe_ring_data *rdata) | ||
| 250 | { | 260 | { |
| 251 | if (!ring->rx_pa.pages) { | 261 | struct page *pages = NULL; |
| 252 | struct page *pages = NULL; | 262 | dma_addr_t pages_dma; |
| 253 | dma_addr_t pages_dma; | 263 | int ret; |
| 254 | gfp_t gfp; | ||
| 255 | int order, ret; | ||
| 256 | |||
| 257 | /* Try to obtain pages, decreasing order if necessary */ | ||
| 258 | gfp = GFP_ATOMIC | __GFP_COLD | __GFP_COMP; | ||
| 259 | order = max_t(int, PAGE_ALLOC_COSTLY_ORDER, 1); | ||
| 260 | while (--order >= 0) { | ||
| 261 | pages = alloc_pages(gfp, order); | ||
| 262 | if (pages) | ||
| 263 | break; | ||
| 264 | } | ||
| 265 | if (!pages) | ||
| 266 | return -ENOMEM; | ||
| 267 | 264 | ||
| 268 | /* Map the pages */ | 265 | /* Try to obtain pages, decreasing order if necessary */ |
| 269 | pages_dma = dma_map_page(pdata->dev, pages, 0, | 266 | gfp |= __GFP_COLD | __GFP_COMP; |
| 270 | PAGE_SIZE << order, DMA_FROM_DEVICE); | 267 | while (order >= 0) { |
| 271 | ret = dma_mapping_error(pdata->dev, pages_dma); | 268 | pages = alloc_pages(gfp, order); |
| 272 | if (ret) { | 269 | if (pages) |
| 273 | put_page(pages); | 270 | break; |
| 274 | return ret; | ||
| 275 | } | ||
| 276 | 271 | ||
| 277 | /* Set the values for this ring */ | 272 | order--; |
| 278 | ring->rx_pa.pages = pages; | ||
| 279 | ring->rx_pa.pages_len = PAGE_SIZE << order; | ||
| 280 | ring->rx_pa.pages_offset = 0; | ||
| 281 | ring->rx_pa.pages_dma = pages_dma; | ||
| 282 | } | 273 | } |
| 274 | if (!pages) | ||
| 275 | return -ENOMEM; | ||
| 283 | 276 | ||
| 284 | get_page(ring->rx_pa.pages); | 277 | /* Map the pages */ |
| 285 | rdata->rx_pa = ring->rx_pa; | 278 | pages_dma = dma_map_page(pdata->dev, pages, 0, |
| 279 | PAGE_SIZE << order, DMA_FROM_DEVICE); | ||
| 280 | ret = dma_mapping_error(pdata->dev, pages_dma); | ||
| 281 | if (ret) { | ||
| 282 | put_page(pages); | ||
| 283 | return ret; | ||
| 284 | } | ||
| 286 | 285 | ||
| 287 | rdata->rx_dma = ring->rx_pa.pages_dma + ring->rx_pa.pages_offset; | 286 | pa->pages = pages; |
| 288 | rdata->rx_dma_len = pdata->rx_buf_size; | 287 | pa->pages_len = PAGE_SIZE << order; |
| 288 | pa->pages_offset = 0; | ||
| 289 | pa->pages_dma = pages_dma; | ||
| 289 | 290 | ||
| 290 | ring->rx_pa.pages_offset += pdata->rx_buf_size; | 291 | return 0; |
| 291 | if ((ring->rx_pa.pages_offset + pdata->rx_buf_size) > | 292 | } |
| 292 | ring->rx_pa.pages_len) { | 293 | |
| 294 | static void xgbe_set_buffer_data(struct xgbe_buffer_data *bd, | ||
| 295 | struct xgbe_page_alloc *pa, | ||
| 296 | unsigned int len) | ||
| 297 | { | ||
| 298 | get_page(pa->pages); | ||
| 299 | bd->pa = *pa; | ||
| 300 | |||
| 301 | bd->dma = pa->pages_dma + pa->pages_offset; | ||
| 302 | bd->dma_len = len; | ||
| 303 | |||
| 304 | pa->pages_offset += len; | ||
| 305 | if ((pa->pages_offset + len) > pa->pages_len) { | ||
| 293 | /* This data descriptor is responsible for unmapping page(s) */ | 306 | /* This data descriptor is responsible for unmapping page(s) */ |
| 294 | rdata->rx_unmap = ring->rx_pa; | 307 | bd->pa_unmap = *pa; |
| 295 | 308 | ||
| 296 | /* Get a new allocation next time */ | 309 | /* Get a new allocation next time */ |
| 297 | ring->rx_pa.pages = NULL; | 310 | pa->pages = NULL; |
| 298 | ring->rx_pa.pages_len = 0; | 311 | pa->pages_len = 0; |
| 299 | ring->rx_pa.pages_offset = 0; | 312 | pa->pages_offset = 0; |
| 300 | ring->rx_pa.pages_dma = 0; | 313 | pa->pages_dma = 0; |
| 314 | } | ||
| 315 | } | ||
| 316 | |||
| 317 | static int xgbe_map_rx_buffer(struct xgbe_prv_data *pdata, | ||
| 318 | struct xgbe_ring *ring, | ||
| 319 | struct xgbe_ring_data *rdata) | ||
| 320 | { | ||
| 321 | int order, ret; | ||
| 322 | |||
| 323 | if (!ring->rx_hdr_pa.pages) { | ||
| 324 | ret = xgbe_alloc_pages(pdata, &ring->rx_hdr_pa, GFP_ATOMIC, 0); | ||
| 325 | if (ret) | ||
| 326 | return ret; | ||
| 327 | } | ||
| 328 | |||
| 329 | if (!ring->rx_buf_pa.pages) { | ||
| 330 | order = max_t(int, PAGE_ALLOC_COSTLY_ORDER - 1, 0); | ||
| 331 | ret = xgbe_alloc_pages(pdata, &ring->rx_buf_pa, GFP_ATOMIC, | ||
| 332 | order); | ||
| 333 | if (ret) | ||
| 334 | return ret; | ||
| 301 | } | 335 | } |
| 302 | 336 | ||
| 337 | /* Set up the header page info */ | ||
| 338 | xgbe_set_buffer_data(&rdata->rx_hdr, &ring->rx_hdr_pa, | ||
| 339 | XGBE_SKB_ALLOC_SIZE); | ||
| 340 | |||
| 341 | /* Set up the buffer page info */ | ||
| 342 | xgbe_set_buffer_data(&rdata->rx_buf, &ring->rx_buf_pa, | ||
| 343 | pdata->rx_buf_size); | ||
| 344 | |||
| 303 | return 0; | 345 | return 0; |
| 304 | } | 346 | } |
| 305 | 347 | ||
| @@ -409,20 +451,28 @@ static void xgbe_unmap_rdata(struct xgbe_prv_data *pdata, | |||
| 409 | rdata->skb = NULL; | 451 | rdata->skb = NULL; |
| 410 | } | 452 | } |
| 411 | 453 | ||
| 412 | if (rdata->rx_pa.pages) | 454 | if (rdata->rx_hdr.pa.pages) |
| 413 | put_page(rdata->rx_pa.pages); | 455 | put_page(rdata->rx_hdr.pa.pages); |
| 414 | 456 | ||
| 415 | if (rdata->rx_unmap.pages) { | 457 | if (rdata->rx_hdr.pa_unmap.pages) { |
| 416 | dma_unmap_page(pdata->dev, rdata->rx_unmap.pages_dma, | 458 | dma_unmap_page(pdata->dev, rdata->rx_hdr.pa_unmap.pages_dma, |
| 417 | rdata->rx_unmap.pages_len, DMA_FROM_DEVICE); | 459 | rdata->rx_hdr.pa_unmap.pages_len, |
| 418 | put_page(rdata->rx_unmap.pages); | 460 | DMA_FROM_DEVICE); |
| 461 | put_page(rdata->rx_hdr.pa_unmap.pages); | ||
| 419 | } | 462 | } |
| 420 | 463 | ||
| 421 | memset(&rdata->rx_pa, 0, sizeof(rdata->rx_pa)); | 464 | if (rdata->rx_buf.pa.pages) |
| 422 | memset(&rdata->rx_unmap, 0, sizeof(rdata->rx_unmap)); | 465 | put_page(rdata->rx_buf.pa.pages); |
| 466 | |||
| 467 | if (rdata->rx_buf.pa_unmap.pages) { | ||
| 468 | dma_unmap_page(pdata->dev, rdata->rx_buf.pa_unmap.pages_dma, | ||
| 469 | rdata->rx_buf.pa_unmap.pages_len, | ||
| 470 | DMA_FROM_DEVICE); | ||
| 471 | put_page(rdata->rx_buf.pa_unmap.pages); | ||
| 472 | } | ||
| 423 | 473 | ||
| 424 | rdata->rx_dma = 0; | 474 | memset(&rdata->rx_hdr, 0, sizeof(rdata->rx_hdr)); |
| 425 | rdata->rx_dma_len = 0; | 475 | memset(&rdata->rx_buf, 0, sizeof(rdata->rx_buf)); |
| 426 | 476 | ||
| 427 | rdata->tso_header = 0; | 477 | rdata->tso_header = 0; |
| 428 | rdata->len = 0; | 478 | rdata->len = 0; |
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c index 7748b758baf6..b3719f154637 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c | |||
| @@ -335,6 +335,22 @@ static void xgbe_config_tso_mode(struct xgbe_prv_data *pdata) | |||
| 335 | } | 335 | } |
| 336 | } | 336 | } |
| 337 | 337 | ||
| 338 | static void xgbe_config_sph_mode(struct xgbe_prv_data *pdata) | ||
| 339 | { | ||
| 340 | struct xgbe_channel *channel; | ||
| 341 | unsigned int i; | ||
| 342 | |||
| 343 | channel = pdata->channel; | ||
| 344 | for (i = 0; i < pdata->channel_count; i++, channel++) { | ||
| 345 | if (!channel->rx_ring) | ||
| 346 | break; | ||
| 347 | |||
| 348 | XGMAC_DMA_IOWRITE_BITS(channel, DMA_CH_CR, SPH, 1); | ||
| 349 | } | ||
| 350 | |||
| 351 | XGMAC_IOWRITE_BITS(pdata, MAC_RCR, HDSMS, XGBE_SPH_HDSMS_SIZE); | ||
| 352 | } | ||
| 353 | |||
| 338 | static int xgbe_disable_tx_flow_control(struct xgbe_prv_data *pdata) | 354 | static int xgbe_disable_tx_flow_control(struct xgbe_prv_data *pdata) |
| 339 | { | 355 | { |
| 340 | unsigned int max_q_count, q_count; | 356 | unsigned int max_q_count, q_count; |
| @@ -920,19 +936,19 @@ static void xgbe_rx_desc_reset(struct xgbe_ring_data *rdata) | |||
| 920 | struct xgbe_ring_desc *rdesc = rdata->rdesc; | 936 | struct xgbe_ring_desc *rdesc = rdata->rdesc; |
| 921 | 937 | ||
| 922 | /* Reset the Rx descriptor | 938 | /* Reset the Rx descriptor |
| 923 | * Set buffer 1 (lo) address to dma address (lo) | 939 | * Set buffer 1 (lo) address to header dma address (lo) |
| 924 | * Set buffer 1 (hi) address to dma address (hi) | 940 | * Set buffer 1 (hi) address to header dma address (hi) |
| 925 | * Set buffer 2 (lo) address to zero | 941 | * Set buffer 2 (lo) address to buffer dma address (lo) |
| 926 | * Set buffer 2 (hi) address to zero and set control bits | 942 | * Set buffer 2 (hi) address to buffer dma address (hi) and |
| 927 | * OWN and INTE | 943 | * set control bits OWN and INTE |
| 928 | */ | 944 | */ |
| 929 | rdesc->desc0 = cpu_to_le32(lower_32_bits(rdata->rx_dma)); | 945 | rdesc->desc0 = cpu_to_le32(lower_32_bits(rdata->rx_hdr.dma)); |
| 930 | rdesc->desc1 = cpu_to_le32(upper_32_bits(rdata->rx_dma)); | 946 | rdesc->desc1 = cpu_to_le32(upper_32_bits(rdata->rx_hdr.dma)); |
| 931 | rdesc->desc2 = 0; | 947 | rdesc->desc2 = cpu_to_le32(lower_32_bits(rdata->rx_buf.dma)); |
| 948 | rdesc->desc3 = cpu_to_le32(upper_32_bits(rdata->rx_buf.dma)); | ||
| 932 | 949 | ||
| 933 | rdesc->desc3 = 0; | 950 | XGMAC_SET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, INTE, |
| 934 | if (rdata->interrupt) | 951 | rdata->interrupt ? 1 : 0); |
| 935 | XGMAC_SET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, INTE, 1); | ||
| 936 | 952 | ||
| 937 | /* Since the Rx DMA engine is likely running, make sure everything | 953 | /* Since the Rx DMA engine is likely running, make sure everything |
| 938 | * is written to the descriptor(s) before setting the OWN bit | 954 | * is written to the descriptor(s) before setting the OWN bit |
| @@ -1422,6 +1438,11 @@ static int xgbe_dev_read(struct xgbe_channel *channel) | |||
| 1422 | XGMAC_SET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES, | 1438 | XGMAC_SET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES, |
| 1423 | CONTEXT_NEXT, 1); | 1439 | CONTEXT_NEXT, 1); |
| 1424 | 1440 | ||
| 1441 | /* Get the header length */ | ||
| 1442 | if (XGMAC_GET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, FD)) | ||
| 1443 | rdata->hdr_len = XGMAC_GET_BITS_LE(rdesc->desc2, | ||
| 1444 | RX_NORMAL_DESC2, HL); | ||
| 1445 | |||
| 1425 | /* Get the packet length */ | 1446 | /* Get the packet length */ |
| 1426 | rdata->len = XGMAC_GET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, PL); | 1447 | rdata->len = XGMAC_GET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, PL); |
| 1427 | 1448 | ||
| @@ -2453,6 +2474,7 @@ static int xgbe_init(struct xgbe_prv_data *pdata) | |||
| 2453 | xgbe_config_tx_coalesce(pdata); | 2474 | xgbe_config_tx_coalesce(pdata); |
| 2454 | xgbe_config_rx_buffer_size(pdata); | 2475 | xgbe_config_rx_buffer_size(pdata); |
| 2455 | xgbe_config_tso_mode(pdata); | 2476 | xgbe_config_tso_mode(pdata); |
| 2477 | xgbe_config_sph_mode(pdata); | ||
| 2456 | desc_if->wrapper_tx_desc_init(pdata); | 2478 | desc_if->wrapper_tx_desc_init(pdata); |
| 2457 | desc_if->wrapper_rx_desc_init(pdata); | 2479 | desc_if->wrapper_rx_desc_init(pdata); |
| 2458 | xgbe_enable_dma_interrupts(pdata); | 2480 | xgbe_enable_dma_interrupts(pdata); |
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c index d65f5aa8fdce..07e2d216323a 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c | |||
| @@ -1620,31 +1620,25 @@ static void xgbe_rx_refresh(struct xgbe_channel *channel) | |||
| 1620 | 1620 | ||
| 1621 | static struct sk_buff *xgbe_create_skb(struct xgbe_prv_data *pdata, | 1621 | static struct sk_buff *xgbe_create_skb(struct xgbe_prv_data *pdata, |
| 1622 | struct xgbe_ring_data *rdata, | 1622 | struct xgbe_ring_data *rdata, |
| 1623 | unsigned int len) | 1623 | unsigned int *len) |
| 1624 | { | 1624 | { |
| 1625 | struct net_device *netdev = pdata->netdev; | 1625 | struct net_device *netdev = pdata->netdev; |
| 1626 | struct sk_buff *skb; | 1626 | struct sk_buff *skb; |
| 1627 | u8 *packet; | 1627 | u8 *packet; |
| 1628 | unsigned int copy_len; | 1628 | unsigned int copy_len; |
| 1629 | 1629 | ||
| 1630 | skb = netdev_alloc_skb_ip_align(netdev, XGBE_SKB_ALLOC_SIZE); | 1630 | skb = netdev_alloc_skb_ip_align(netdev, rdata->rx_hdr.dma_len); |
| 1631 | if (!skb) | 1631 | if (!skb) |
| 1632 | return NULL; | 1632 | return NULL; |
| 1633 | 1633 | ||
| 1634 | packet = page_address(rdata->rx_pa.pages) + rdata->rx_pa.pages_offset; | 1634 | packet = page_address(rdata->rx_hdr.pa.pages) + |
| 1635 | copy_len = min_t(unsigned int, XGBE_SKB_ALLOC_SIZE, len); | 1635 | rdata->rx_hdr.pa.pages_offset; |
| 1636 | copy_len = (rdata->hdr_len) ? rdata->hdr_len : *len; | ||
| 1637 | copy_len = min(rdata->rx_hdr.dma_len, copy_len); | ||
| 1636 | skb_copy_to_linear_data(skb, packet, copy_len); | 1638 | skb_copy_to_linear_data(skb, packet, copy_len); |
| 1637 | skb_put(skb, copy_len); | 1639 | skb_put(skb, copy_len); |
| 1638 | 1640 | ||
| 1639 | rdata->rx_pa.pages_offset += copy_len; | 1641 | *len -= copy_len; |
| 1640 | len -= copy_len; | ||
| 1641 | if (len) | ||
| 1642 | skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, | ||
| 1643 | rdata->rx_pa.pages, | ||
| 1644 | rdata->rx_pa.pages_offset, | ||
| 1645 | len, rdata->rx_dma_len); | ||
| 1646 | else | ||
| 1647 | put_page(rdata->rx_pa.pages); | ||
| 1648 | 1642 | ||
| 1649 | return skb; | 1643 | return skb; |
| 1650 | } | 1644 | } |
| @@ -1757,10 +1751,6 @@ read_again: | |||
| 1757 | ring->cur++; | 1751 | ring->cur++; |
| 1758 | ring->dirty++; | 1752 | ring->dirty++; |
| 1759 | 1753 | ||
| 1760 | dma_sync_single_for_cpu(pdata->dev, rdata->rx_dma, | ||
| 1761 | rdata->rx_dma_len, | ||
| 1762 | DMA_FROM_DEVICE); | ||
| 1763 | |||
| 1764 | incomplete = XGMAC_GET_BITS(packet->attributes, | 1754 | incomplete = XGMAC_GET_BITS(packet->attributes, |
| 1765 | RX_PACKET_ATTRIBUTES, | 1755 | RX_PACKET_ATTRIBUTES, |
| 1766 | INCOMPLETE); | 1756 | INCOMPLETE); |
| @@ -1787,19 +1777,30 @@ read_again: | |||
| 1787 | len += put_len; | 1777 | len += put_len; |
| 1788 | 1778 | ||
| 1789 | if (!skb) { | 1779 | if (!skb) { |
| 1790 | skb = xgbe_create_skb(pdata, rdata, put_len); | 1780 | dma_sync_single_for_cpu(pdata->dev, |
| 1781 | rdata->rx_hdr.dma, | ||
| 1782 | rdata->rx_hdr.dma_len, | ||
| 1783 | DMA_FROM_DEVICE); | ||
| 1784 | |||
| 1785 | skb = xgbe_create_skb(pdata, rdata, &put_len); | ||
| 1791 | if (!skb) { | 1786 | if (!skb) { |
| 1792 | error = 1; | 1787 | error = 1; |
| 1793 | goto read_again; | 1788 | goto read_again; |
| 1794 | } | 1789 | } |
| 1795 | } else { | ||
| 1796 | skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, | ||
| 1797 | rdata->rx_pa.pages, | ||
| 1798 | rdata->rx_pa.pages_offset, | ||
| 1799 | put_len, rdata->rx_dma_len); | ||
| 1800 | } | 1790 | } |
| 1801 | 1791 | ||
| 1802 | rdata->rx_pa.pages = NULL; | 1792 | if (put_len) { |
| 1793 | dma_sync_single_for_cpu(pdata->dev, | ||
| 1794 | rdata->rx_buf.dma, | ||
| 1795 | rdata->rx_buf.dma_len, | ||
| 1796 | DMA_FROM_DEVICE); | ||
| 1797 | |||
| 1798 | skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, | ||
| 1799 | rdata->rx_buf.pa.pages, | ||
| 1800 | rdata->rx_buf.pa.pages_offset, | ||
| 1801 | put_len, rdata->rx_buf.dma_len); | ||
| 1802 | rdata->rx_buf.pa.pages = NULL; | ||
| 1803 | } | ||
| 1803 | } | 1804 | } |
| 1804 | 1805 | ||
| 1805 | if (incomplete || context_next) | 1806 | if (incomplete || context_next) |
| @@ -1924,10 +1925,10 @@ void xgbe_dump_tx_desc(struct xgbe_ring *ring, unsigned int idx, | |||
| 1924 | while (count--) { | 1925 | while (count--) { |
| 1925 | rdata = XGBE_GET_DESC_DATA(ring, idx); | 1926 | rdata = XGBE_GET_DESC_DATA(ring, idx); |
| 1926 | rdesc = rdata->rdesc; | 1927 | rdesc = rdata->rdesc; |
| 1927 | DBGPR("TX_NORMAL_DESC[%d %s] = %08x:%08x:%08x:%08x\n", idx, | 1928 | pr_alert("TX_NORMAL_DESC[%d %s] = %08x:%08x:%08x:%08x\n", idx, |
| 1928 | (flag == 1) ? "QUEUED FOR TX" : "TX BY DEVICE", | 1929 | (flag == 1) ? "QUEUED FOR TX" : "TX BY DEVICE", |
| 1929 | le32_to_cpu(rdesc->desc0), le32_to_cpu(rdesc->desc1), | 1930 | le32_to_cpu(rdesc->desc0), le32_to_cpu(rdesc->desc1), |
| 1930 | le32_to_cpu(rdesc->desc2), le32_to_cpu(rdesc->desc3)); | 1931 | le32_to_cpu(rdesc->desc2), le32_to_cpu(rdesc->desc3)); |
| 1931 | idx++; | 1932 | idx++; |
| 1932 | } | 1933 | } |
| 1933 | } | 1934 | } |
| @@ -1935,9 +1936,9 @@ void xgbe_dump_tx_desc(struct xgbe_ring *ring, unsigned int idx, | |||
| 1935 | void xgbe_dump_rx_desc(struct xgbe_ring *ring, struct xgbe_ring_desc *desc, | 1936 | void xgbe_dump_rx_desc(struct xgbe_ring *ring, struct xgbe_ring_desc *desc, |
| 1936 | unsigned int idx) | 1937 | unsigned int idx) |
| 1937 | { | 1938 | { |
| 1938 | DBGPR("RX_NORMAL_DESC[%d RX BY DEVICE] = %08x:%08x:%08x:%08x\n", idx, | 1939 | pr_alert("RX_NORMAL_DESC[%d RX BY DEVICE] = %08x:%08x:%08x:%08x\n", idx, |
| 1939 | le32_to_cpu(desc->desc0), le32_to_cpu(desc->desc1), | 1940 | le32_to_cpu(desc->desc0), le32_to_cpu(desc->desc1), |
| 1940 | le32_to_cpu(desc->desc2), le32_to_cpu(desc->desc3)); | 1941 | le32_to_cpu(desc->desc2), le32_to_cpu(desc->desc3)); |
| 1941 | } | 1942 | } |
| 1942 | 1943 | ||
| 1943 | void xgbe_print_pkt(struct net_device *netdev, struct sk_buff *skb, bool tx_rx) | 1944 | void xgbe_print_pkt(struct net_device *netdev, struct sk_buff *skb, bool tx_rx) |
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe.h b/drivers/net/ethernet/amd/xgbe/xgbe.h index d3aa05501ee8..1480c9d41821 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe.h +++ b/drivers/net/ethernet/amd/xgbe/xgbe.h | |||
| @@ -143,6 +143,7 @@ | |||
| 143 | #define XGBE_RX_MIN_BUF_SIZE (ETH_FRAME_LEN + ETH_FCS_LEN + VLAN_HLEN) | 143 | #define XGBE_RX_MIN_BUF_SIZE (ETH_FRAME_LEN + ETH_FCS_LEN + VLAN_HLEN) |
| 144 | #define XGBE_RX_BUF_ALIGN 64 | 144 | #define XGBE_RX_BUF_ALIGN 64 |
| 145 | #define XGBE_SKB_ALLOC_SIZE 256 | 145 | #define XGBE_SKB_ALLOC_SIZE 256 |
| 146 | #define XGBE_SPH_HDSMS_SIZE 2 /* Keep in sync with SKB_ALLOC_SIZE */ | ||
| 146 | 147 | ||
| 147 | #define XGBE_MAX_DMA_CHANNELS 16 | 148 | #define XGBE_MAX_DMA_CHANNELS 16 |
| 148 | #define XGBE_MAX_QUEUES 16 | 149 | #define XGBE_MAX_QUEUES 16 |
| @@ -250,6 +251,15 @@ struct xgbe_page_alloc { | |||
| 250 | dma_addr_t pages_dma; | 251 | dma_addr_t pages_dma; |
| 251 | }; | 252 | }; |
| 252 | 253 | ||
| 254 | /* Ring entry buffer data */ | ||
| 255 | struct xgbe_buffer_data { | ||
| 256 | struct xgbe_page_alloc pa; | ||
| 257 | struct xgbe_page_alloc pa_unmap; | ||
| 258 | |||
| 259 | dma_addr_t dma; | ||
| 260 | unsigned int dma_len; | ||
| 261 | }; | ||
| 262 | |||
| 253 | /* Structure used to hold information related to the descriptor | 263 | /* Structure used to hold information related to the descriptor |
| 254 | * and the packet associated with the descriptor (always use | 264 | * and the packet associated with the descriptor (always use |
| 255 | * use the XGBE_GET_DESC_DATA macro to access this data from the ring) | 265 | * use the XGBE_GET_DESC_DATA macro to access this data from the ring) |
| @@ -263,12 +273,10 @@ struct xgbe_ring_data { | |||
| 263 | unsigned int skb_dma_len; /* Length of SKB DMA area */ | 273 | unsigned int skb_dma_len; /* Length of SKB DMA area */ |
| 264 | unsigned int tso_header; /* TSO header indicator */ | 274 | unsigned int tso_header; /* TSO header indicator */ |
| 265 | 275 | ||
| 266 | struct xgbe_page_alloc rx_pa; /* Rx buffer page allocation */ | 276 | struct xgbe_buffer_data rx_hdr; /* Header locations */ |
| 267 | struct xgbe_page_alloc rx_unmap; | 277 | struct xgbe_buffer_data rx_buf; /* Payload locations */ |
| 268 | |||
| 269 | dma_addr_t rx_dma; /* DMA address of Rx buffer */ | ||
| 270 | unsigned int rx_dma_len; /* Length of the Rx DMA buffer */ | ||
| 271 | 278 | ||
| 279 | unsigned short hdr_len; /* Length of received header */ | ||
| 272 | unsigned short len; /* Length of received Rx packet */ | 280 | unsigned short len; /* Length of received Rx packet */ |
| 273 | 281 | ||
| 274 | unsigned int interrupt; /* Interrupt indicator */ | 282 | unsigned int interrupt; /* Interrupt indicator */ |
| @@ -308,7 +316,8 @@ struct xgbe_ring { | |||
| 308 | struct xgbe_ring_data *rdata; | 316 | struct xgbe_ring_data *rdata; |
| 309 | 317 | ||
| 310 | /* Page allocation for RX buffers */ | 318 | /* Page allocation for RX buffers */ |
| 311 | struct xgbe_page_alloc rx_pa; | 319 | struct xgbe_page_alloc rx_hdr_pa; |
| 320 | struct xgbe_page_alloc rx_buf_pa; | ||
| 312 | 321 | ||
| 313 | /* Ring index values | 322 | /* Ring index values |
| 314 | * cur - Tx: index of descriptor to be used for current transfer | 323 | * cur - Tx: index of descriptor to be used for current transfer |
