| 1919 | } |
| 1920 | |
| 1921 | int |
| 1922 | ionic_lif_start(struct ionic_lif *lif) |
| 1923 | { |
| 1924 | uint32_t rx_mode; |
| 1925 | uint32_t i; |
| 1926 | int err; |
| 1927 | |
| 1928 | err = ionic_lif_rss_setup(lif); |
| 1929 | if (err) |
| 1930 | return err; |
| 1931 | |
| 1932 | if (!lif->rx_mode) { |
| 1933 | IONIC_PRINT(DEBUG, "Setting RX mode on %s", |
| 1934 | lif->name); |
| 1935 | |
| 1936 | rx_mode = IONIC_RX_MODE_F_UNICAST; |
| 1937 | rx_mode |= IONIC_RX_MODE_F_MULTICAST; |
| 1938 | rx_mode |= IONIC_RX_MODE_F_BROADCAST; |
| 1939 | |
| 1940 | ionic_set_rx_mode(lif, rx_mode); |
| 1941 | } |
| 1942 | |
| 1943 | IONIC_PRINT(DEBUG, "Starting %u RX queues and %u TX queues " |
| 1944 | "on port %u", |
| 1945 | lif->nrxqcqs, lif->ntxqcqs, lif->port_id); |
| 1946 | |
| 1947 | for (i = 0; i < lif->nrxqcqs; i++) { |
| 1948 | struct ionic_rx_qcq *rxq = lif->rxqcqs[i]; |
| 1949 | if (!(rxq->flags & IONIC_QCQ_F_DEFERRED)) { |
| 1950 | err = ionic_dev_rx_queue_start(lif->eth_dev, i); |
| 1951 | |
| 1952 | if (err) |
| 1953 | return err; |
| 1954 | } |
| 1955 | } |
| 1956 | |
| 1957 | for (i = 0; i < lif->ntxqcqs; i++) { |
| 1958 | struct ionic_tx_qcq *txq = lif->txqcqs[i]; |
| 1959 | if (!(txq->flags & IONIC_QCQ_F_DEFERRED)) { |
| 1960 | err = ionic_dev_tx_queue_start(lif->eth_dev, i); |
| 1961 | |
| 1962 | if (err) |
| 1963 | return err; |
| 1964 | } |
| 1965 | } |
| 1966 | |
| 1967 | /* Carrier ON here */ |
| 1968 | lif->state |= IONIC_LIF_F_UP; |
| 1969 | |
| 1970 | ionic_link_status_check(lif); |
| 1971 | |
| 1972 | return 0; |
| 1973 | } |
| 1974 | |
| 1975 | int |
| 1976 | ionic_lif_identify(struct ionic_adapter *adapter) |
no test coverage detected