Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'net' of git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile

+34 -27
+34 -27
drivers/net/ethernet/tile/tilegx.c
··· 123 123 124 124 /* The transmit wake timer for a given cpu and echannel. */ 125 125 struct tile_net_tx_wake { 126 + int tx_queue_idx; 126 127 struct hrtimer timer; 127 128 struct net_device *dev; 128 129 }; ··· 574 573 comps->comp_next++; 575 574 } 576 575 577 - static void tile_net_schedule_tx_wake_timer(struct net_device *dev) 576 + static void tile_net_schedule_tx_wake_timer(struct net_device *dev, 577 + int tx_queue_idx) 578 578 { 579 - struct tile_net_info *info = &__get_cpu_var(per_cpu_info); 579 + struct tile_net_info *info = &per_cpu(per_cpu_info, tx_queue_idx); 580 580 struct tile_net_priv *priv = netdev_priv(dev); 581 + struct tile_net_tx_wake *tx_wake = &info->tx_wake[priv->echannel]; 581 582 582 - hrtimer_start(&info->tx_wake[priv->echannel].timer, 583 + hrtimer_start(&tx_wake->timer, 583 584 ktime_set(0, TX_TIMER_DELAY_USEC * 1000UL), 584 585 HRTIMER_MODE_REL_PINNED); 585 586 } ··· 590 587 { 591 588 struct tile_net_tx_wake *tx_wake = 592 589 container_of(t, struct tile_net_tx_wake, timer); 593 - netif_wake_subqueue(tx_wake->dev, smp_processor_id()); 590 + netif_wake_subqueue(tx_wake->dev, tx_wake->tx_queue_idx); 594 591 return HRTIMER_NORESTART; 595 592 } 596 593 ··· 1221 1218 1222 1219 hrtimer_init(&tx_wake->timer, CLOCK_MONOTONIC, 1223 1220 HRTIMER_MODE_REL); 1221 + tx_wake->tx_queue_idx = cpu; 1224 1222 tx_wake->timer.function = tile_net_handle_tx_wake_timer; 1225 1223 tx_wake->dev = dev; 1226 1224 } ··· 1295 1291 * stop the queue and schedule the tx_wake timer. 1296 1292 */ 1297 1293 static s64 tile_net_equeue_try_reserve(struct net_device *dev, 1294 + int tx_queue_idx, 1298 1295 struct tile_net_comps *comps, 1299 1296 gxio_mpipe_equeue_t *equeue, 1300 1297 int num_edescs) ··· 1318 1313 } 1319 1314 1320 1315 /* Still nothing; give up and stop the queue for a short while. */ 1321 - netif_stop_subqueue(dev, smp_processor_id()); 1322 - tile_net_schedule_tx_wake_timer(dev); 1316 + netif_stop_subqueue(dev, tx_queue_idx); 1317 + tile_net_schedule_tx_wake_timer(dev, tx_queue_idx); 1323 1318 return -1; 1324 1319 } 1325 1320 ··· 1333 1328 static int tso_count_edescs(struct sk_buff *skb) 1334 1329 { 1335 1330 struct skb_shared_info *sh = skb_shinfo(skb); 1336 - unsigned int data_len = skb->data_len; 1331 + unsigned int sh_len = skb_transport_offset(skb) + tcp_hdrlen(skb); 1332 + unsigned int data_len = skb->data_len + skb->hdr_len - sh_len; 1337 1333 unsigned int p_len = sh->gso_size; 1338 1334 long f_id = -1; /* id of the current fragment */ 1339 - long f_size = -1; /* size of the current fragment */ 1340 - long f_used = -1; /* bytes used from the current fragment */ 1335 + long f_size = skb->hdr_len; /* size of the current fragment */ 1336 + long f_used = sh_len; /* bytes used from the current fragment */ 1341 1337 long n; /* size of the current piece of payload */ 1342 1338 int num_edescs = 0; 1343 1339 int segment; ··· 1383 1377 struct skb_shared_info *sh = skb_shinfo(skb); 1384 1378 struct iphdr *ih; 1385 1379 struct tcphdr *th; 1386 - unsigned int data_len = skb->data_len; 1380 + unsigned int sh_len = skb_transport_offset(skb) + tcp_hdrlen(skb); 1381 + unsigned int data_len = skb->data_len + skb->hdr_len - sh_len; 1387 1382 unsigned char *data = skb->data; 1388 - unsigned int ih_off, th_off, sh_len, p_len; 1383 + unsigned int ih_off, th_off, p_len; 1389 1384 unsigned int isum_seed, tsum_seed, id, seq; 1390 1385 long f_id = -1; /* id of the current fragment */ 1391 - long f_size = -1; /* size of the current fragment */ 1392 - long f_used = -1; /* bytes used from the current fragment */ 1386 + long f_size = skb->hdr_len; /* size of the current fragment */ 1387 + long f_used = sh_len; /* bytes used from the current fragment */ 1393 1388 long n; /* size of the current piece of payload */ 1394 1389 int segment; 1395 1390 ··· 1399 1392 th = tcp_hdr(skb); 1400 1393 ih_off = skb_network_offset(skb); 1401 1394 th_off = skb_transport_offset(skb); 1402 - sh_len = th_off + tcp_hdrlen(skb); 1403 1395 p_len = sh->gso_size; 1404 1396 1405 1397 /* Set up seed values for IP and TCP csum and initialize id and seq. */ 1406 1398 isum_seed = ((0xFFFF - ih->check) + 1407 1399 (0xFFFF - ih->tot_len) + 1408 1400 (0xFFFF - ih->id)); 1409 - tsum_seed = th->check + (0xFFFF ^ htons(skb->len)); 1401 + tsum_seed = th->check + (0xFFFF ^ htons(sh_len + data_len)); 1410 1402 id = ntohs(ih->id); 1411 1403 seq = ntohl(th->seq); 1412 1404 ··· 1477 1471 { 1478 1472 struct tile_net_priv *priv = netdev_priv(dev); 1479 1473 struct skb_shared_info *sh = skb_shinfo(skb); 1480 - unsigned int data_len = skb->data_len; 1474 + unsigned int sh_len = skb_transport_offset(skb) + tcp_hdrlen(skb); 1475 + unsigned int data_len = skb->data_len + skb->hdr_len - sh_len; 1481 1476 unsigned int p_len = sh->gso_size; 1482 1477 gxio_mpipe_edesc_t edesc_head = { { 0 } }; 1483 1478 gxio_mpipe_edesc_t edesc_body = { { 0 } }; 1484 1479 long f_id = -1; /* id of the current fragment */ 1485 - long f_size = -1; /* size of the current fragment */ 1486 - long f_used = -1; /* bytes used from the current fragment */ 1480 + long f_size = skb->hdr_len; /* size of the current fragment */ 1481 + long f_used = sh_len; /* bytes used from the current fragment */ 1482 + void *f_data = skb->data; 1487 1483 long n; /* size of the current piece of payload */ 1488 1484 unsigned long tx_packets = 0, tx_bytes = 0; 1489 - unsigned int csum_start, sh_len; 1485 + unsigned int csum_start; 1490 1486 int segment; 1491 1487 1492 1488 /* Prepare to egress the headers: set up header edesc. */ 1493 1489 csum_start = skb_checksum_start_offset(skb); 1494 - sh_len = skb_transport_offset(skb) + tcp_hdrlen(skb); 1495 1490 edesc_head.csum = 1; 1496 1491 edesc_head.csum_start = csum_start; 1497 1492 edesc_head.csum_dest = csum_start + skb->csum_offset; ··· 1504 1497 1505 1498 /* Egress all the edescs. */ 1506 1499 for (segment = 0; segment < sh->gso_segs; segment++) { 1507 - void *va; 1508 1500 unsigned char *buf; 1509 1501 unsigned int p_used = 0; 1510 1502 ··· 1522 1516 f_id++; 1523 1517 f_size = sh->frags[f_id].size; 1524 1518 f_used = 0; 1519 + f_data = tile_net_frag_buf(&sh->frags[f_id]); 1525 1520 } 1526 - 1527 - va = tile_net_frag_buf(&sh->frags[f_id]) + f_used; 1528 1521 1529 1522 /* Use bytes from the current fragment. */ 1530 1523 n = p_len - p_used; ··· 1533 1528 p_used += n; 1534 1529 1535 1530 /* Egress a piece of the payload. */ 1536 - edesc_body.va = va_to_tile_io_addr(va); 1531 + edesc_body.va = va_to_tile_io_addr(f_data) + f_used; 1537 1532 edesc_body.xfer_size = n; 1538 1533 edesc_body.bound = !(p_used < p_len); 1539 1534 gxio_mpipe_equeue_put_at(equeue, edesc_body, slot); ··· 1585 1580 local_irq_save(irqflags); 1586 1581 1587 1582 /* Try to acquire a completion entry and an egress slot. */ 1588 - slot = tile_net_equeue_try_reserve(dev, comps, equeue, num_edescs); 1583 + slot = tile_net_equeue_try_reserve(dev, skb->queue_mapping, comps, 1584 + equeue, num_edescs); 1589 1585 if (slot < 0) { 1590 1586 local_irq_restore(irqflags); 1591 1587 return NETDEV_TX_BUSY; ··· 1680 1674 local_irq_save(irqflags); 1681 1675 1682 1676 /* Try to acquire a completion entry and an egress slot. */ 1683 - slot = tile_net_equeue_try_reserve(dev, comps, equeue, num_edescs); 1677 + slot = tile_net_equeue_try_reserve(dev, skb->queue_mapping, comps, 1678 + equeue, num_edescs); 1684 1679 if (slot < 0) { 1685 1680 local_irq_restore(irqflags); 1686 1681 return NETDEV_TX_BUSY; ··· 1851 1844 memcpy(dev->dev_addr, mac, 6); 1852 1845 dev->addr_len = 6; 1853 1846 } else { 1854 - eth_random_addr(dev->dev_addr); 1847 + eth_hw_addr_random(dev); 1855 1848 } 1856 1849 1857 1850 /* Register the network device. */