Deleted Added
sdiff udiff text old ( 252869 ) new ( 257007 )
full compact
1/*-
2 * Copyright (C) 2013 Emulex
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,

--- 22 unchanged lines hidden (view full) ---

31 * Contact Information:
32 * freebsd-drivers@emulex.com
33 *
34 * Emulex
35 * 3333 Susan Street
36 * Costa Mesa, CA 92626
37 */
38
39
40/* $FreeBSD: head/sys/dev/oce/oce_if.c 252869 2013-07-06 08:30:45Z delphij $ */
41
42#include "opt_inet6.h"
43#include "opt_inet.h"
44
45#include "oce_if.h"
46
47
48/* Driver entry points prototypes */
49static int oce_probe(device_t dev);
50static int oce_attach(device_t dev);
51static int oce_detach(device_t dev);
52static int oce_shutdown(device_t dev);
53static int oce_ioctl(struct ifnet *ifp, u_long command, caddr_t data);
54static void oce_init(void *xsc);
55static int oce_multiq_start(struct ifnet *ifp, struct mbuf *m);

--- 327 unchanged lines hidden (view full) ---

383 oce_if_deactivate(sc);
384
385 UNLOCK(&sc->dev_lock);
386
387 device_printf(sc->dev, "Interface Down\n");
388 }
389
390 if ((ifp->if_flags & IFF_PROMISC) && !sc->promisc) {
391 sc->promisc = TRUE;
392 oce_rxf_set_promiscuous(sc, sc->promisc);
393 } else if (!(ifp->if_flags & IFF_PROMISC) && sc->promisc) {
394 sc->promisc = FALSE;
395 oce_rxf_set_promiscuous(sc, sc->promisc);
396 }
397
398 break;
399
400 case SIOCADDMULTI:
401 case SIOCDELMULTI:
402 rc = oce_hw_update_multicast(sc);
403 if (rc)

--- 453 unchanged lines hidden (view full) ---

857 nichdr->u0.s.forward = 0;
858 nichdr->u0.s.ipcs = (m->m_pkthdr.csum_flags & CSUM_IP) ? 1 : 0;
859 nichdr->u0.s.udpcs =
860 (m->m_pkthdr.csum_flags & CSUM_UDP) ? 1 : 0;
861 nichdr->u0.s.tcpcs =
862 (m->m_pkthdr.csum_flags & CSUM_TCP) ? 1 : 0;
863 nichdr->u0.s.num_wqe = num_wqes;
864 nichdr->u0.s.total_length = m->m_pkthdr.len;
865 if (m->m_flags & M_VLANTAG) {
866 nichdr->u0.s.vlan = 1; /*Vlan present*/
867 nichdr->u0.s.vlan_tag = m->m_pkthdr.ether_vtag;
868 }
869 if (m->m_pkthdr.csum_flags & CSUM_TSO) {
870 if (m->m_pkthdr.tso_segsz) {
871 nichdr->u0.s.lso = 1;
872 nichdr->u0.s.lso_mss = m->m_pkthdr.tso_segsz;
873 }
874 if (!IS_BE(sc) || !IS_SH(sc))
875 nichdr->u0.s.ipcs = 1;
876 }

--- 274 unchanged lines hidden (view full) ---

1151
1152 if (num_cqes)
1153 oce_arm_cq(sc, cq->cq_id, num_cqes, FALSE);
1154
1155 return 0;
1156}
1157
1158
1159static int
1160oce_multiq_transmit(struct ifnet *ifp, struct mbuf *m, struct oce_wq *wq)
1161{
1162 POCE_SOFTC sc = ifp->if_softc;
1163 int status = 0, queue_index = 0;
1164 struct mbuf *next = NULL;
1165 struct buf_ring *br = NULL;
1166
1167 br = wq->br;
1168 queue_index = wq->queue_index;
1169
1170 if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
1171 IFF_DRV_RUNNING) {
1172 if (m != NULL)
1173 status = drbr_enqueue(ifp, br, m);
1174 return status;
1175 }
1176
1177 if (m != NULL) {
1178 if ((status = drbr_enqueue(ifp, br, m)) != 0)
1179 return status;
1180 }
1181 while ((next = drbr_peek(ifp, br)) != NULL) {
1182 if (oce_tx(sc, &next, queue_index)) {
1183 if (next == NULL) {
1184 drbr_advance(ifp, br);
1185 } else {

--- 455 unchanged lines hidden (view full) ---

1641 sc->ifp->if_capabilities |= IFCAP_TSO;
1642 sc->ifp->if_capabilities |= IFCAP_LRO;
1643 sc->ifp->if_capabilities |= IFCAP_VLAN_HWTSO;
1644#endif
1645
1646 sc->ifp->if_capenable = sc->ifp->if_capabilities;
1647 if_initbaudrate(sc->ifp, IF_Gbps(10));
1648
1649 ether_ifattach(sc->ifp, sc->macaddr.mac_addr);
1650
1651 return 0;
1652}
1653
1654
1655static void
1656oce_add_vlan(void *arg, struct ifnet *ifp, uint16_t vtag)
1657{
1658 POCE_SOFTC sc = ifp->if_softc;
1659
1660 if (ifp->if_softc != arg)
1661 return;
1662 if ((vtag == 0) || (vtag > 4095))
1663 return;
1664
1665 sc->vlan_tag[vtag] = 1;
1666 sc->vlans_added++;
1667 oce_vid_config(sc);
1668}
1669
1670
1671static void
1672oce_del_vlan(void *arg, struct ifnet *ifp, uint16_t vtag)
1673{
1674 POCE_SOFTC sc = ifp->if_softc;
1675

--- 185 unchanged lines hidden (view full) ---

1861 }
1862
1863 /* Is there atleast one eq that needs to be modified? */
1864 if(num)
1865 oce_mbox_eqd_modify_periodic(sc, set_eqd, num);
1866
1867}
1868
1869static void
1870oce_local_timer(void *arg)
1871{
1872 POCE_SOFTC sc = arg;
1873 int i = 0;
1874
1875 oce_refresh_nic_stats(sc);
1876 oce_refresh_queue_stats(sc);
1877 oce_mac_addr_set(sc);
1878
1879 /* TX Watch Dog*/
1880 for (i = 0; i < sc->nwqs; i++)
1881 oce_tx_restart(sc, sc->wq[i]);
1882
1883 /* calculate and set the eq delay for optimal interrupt rate */
1884 if (IS_BE(sc) || IS_SH(sc))
1885 oce_eqd_set_periodic(sc);
1886
1887 callout_reset(&sc->timer, hz, oce_local_timer, sc);
1888}
1889
1890
1891/* NOTE : This should only be called holding
1892 * DEVICE_LOCK.
1893*/
1894static void
1895oce_if_deactivate(POCE_SOFTC sc)
1896{
1897 int i, mtime = 0;
1898 int wait_req = 0;
1899 struct oce_rq *rq;
1900 struct oce_wq *wq;
1901 struct oce_eq *eq;

--- 173 unchanged lines hidden (view full) ---

2075 /* Check if it is FLEX machine. Is so dont use RSS */
2076 if ((sc->function_mode & FNM_FLEX10_MODE) ||
2077 (sc->function_mode & FNM_UMC_MODE) ||
2078 (sc->function_mode & FNM_VNIC_MODE) ||
2079 (!is_rss_enabled(sc)) ||
2080 (sc->flags & OCE_FLAGS_BE2)) {
2081 sc->nrqs = 1;
2082 sc->nwqs = 1;
2083 }
2084}
2085
2086
2087static void
2088update_queues_got(POCE_SOFTC sc)
2089{
2090 if (is_rss_enabled(sc)) {

--- 112 unchanged lines hidden ---