8574 lines · c
1/************************************************************************2 * s2io.c: A Linux PCI-X Ethernet driver for Neterion 10GbE Server NIC3 * Copyright(c) 2002-2010 Exar Corp.4 *5 * This software may be used and distributed according to the terms of6 * the GNU General Public License (GPL), incorporated herein by reference.7 * Drivers based on or derived from this code fall under the GPL and must8 * retain the authorship, copyright and license notice. This file is not9 * a complete program and may only be used when the entire operating10 * system is licensed under the GPL.11 * See the file COPYING in this distribution for more information.12 *13 * Credits:14 * Jeff Garzik : For pointing out the improper error condition15 * check in the s2io_xmit routine and also some16 * issues in the Tx watch dog function. Also for17 * patiently answering all those innumerable18 * questions regaring the 2.6 porting issues.19 * Stephen Hemminger : Providing proper 2.6 porting mechanism for some20 * macros available only in 2.6 Kernel.21 * Francois Romieu : For pointing out all code part that were22 * deprecated and also styling related comments.23 * Grant Grundler : For helping me get rid of some Architecture24 * dependent code.25 * Christopher Hellwig : Some more 2.6 specific issues in the driver.26 *27 * The module loadable parameters that are supported by the driver and a brief28 * explanation of all the variables.29 *30 * rx_ring_num : This can be used to program the number of receive rings used31 * in the driver.32 * rx_ring_sz: This defines the number of receive blocks each ring can have.33 * This is also an array of size 8.34 * rx_ring_mode: This defines the operation mode of all 8 rings. The valid35 * values are 1, 2.36 * tx_fifo_num: This defines the number of Tx FIFOs thats used int the driver.37 * tx_fifo_len: This too is an array of 8. Each element defines the number of38 * Tx descriptors that can be associated with each corresponding FIFO.39 * intr_type: This defines the type of interrupt. The values can be 0(INTA),40 * 2(MSI_X). Default value is '2(MSI_X)'41 * lro_max_pkts: This parameter defines maximum number of packets can be42 * aggregated as a single large packet43 * napi: This parameter used to enable/disable NAPI (polling Rx)44 * Possible values '1' for enable and '0' for disable. Default is '1'45 * vlan_tag_strip: This can be used to enable or disable vlan stripping.46 * Possible values '1' for enable , '0' for disable.47 * Default is '2' - which means disable in promisc mode48 * and enable in non-promiscuous mode.49 * multiq: This parameter used to enable/disable MULTIQUEUE support.50 * Possible values '1' for enable and '0' for disable. Default is '0'51 ************************************************************************/52 53#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt54 55#include <linux/module.h>56#include <linux/types.h>57#include <linux/errno.h>58#include <linux/ioport.h>59#include <linux/pci.h>60#include <linux/dma-mapping.h>61#include <linux/kernel.h>62#include <linux/netdevice.h>63#include <linux/etherdevice.h>64#include <linux/mdio.h>65#include <linux/skbuff.h>66#include <linux/init.h>67#include <linux/delay.h>68#include <linux/stddef.h>69#include <linux/ioctl.h>70#include <linux/timex.h>71#include <linux/ethtool.h>72#include <linux/workqueue.h>73#include <linux/if_vlan.h>74#include <linux/ip.h>75#include <linux/tcp.h>76#include <linux/uaccess.h>77#include <linux/io.h>78#include <linux/io-64-nonatomic-lo-hi.h>79#include <linux/slab.h>80#include <linux/prefetch.h>81#include <net/tcp.h>82#include <net/checksum.h>83 84#include <asm/div64.h>85#include <asm/irq.h>86 87/* local include */88#include "s2io.h"89#include "s2io-regs.h"90 91#define DRV_VERSION "2.0.26.28"92 93/* S2io Driver name & version. */94static const char s2io_driver_name[] = "Neterion";95static const char s2io_driver_version[] = DRV_VERSION;96 97static const int rxd_size[2] = {32, 48};98static const int rxd_count[2] = {127, 85};99 100static inline int RXD_IS_UP2DT(struct RxD_t *rxdp)101{102 int ret;103 104 ret = ((!(rxdp->Control_1 & RXD_OWN_XENA)) &&105 (GET_RXD_MARKER(rxdp->Control_2) != THE_RXD_MARK));106 107 return ret;108}109 110/*111 * Cards with following subsystem_id have a link state indication112 * problem, 600B, 600C, 600D, 640B, 640C and 640D.113 * macro below identifies these cards given the subsystem_id.114 */115#define CARDS_WITH_FAULTY_LINK_INDICATORS(dev_type, subid) \116 (dev_type == XFRAME_I_DEVICE) ? \117 ((((subid >= 0x600B) && (subid <= 0x600D)) || \118 ((subid >= 0x640B) && (subid <= 0x640D))) ? 1 : 0) : 0119 120#define LINK_IS_UP(val64) (!(val64 & (ADAPTER_STATUS_RMAC_REMOTE_FAULT | \121 ADAPTER_STATUS_RMAC_LOCAL_FAULT)))122 123static inline int is_s2io_card_up(const struct s2io_nic *sp)124{125 return test_bit(__S2IO_STATE_CARD_UP, &sp->state);126}127 128/* Ethtool related variables and Macros. */129static const char s2io_gstrings[][ETH_GSTRING_LEN] = {130 "Register test\t(offline)",131 "Eeprom test\t(offline)",132 "Link test\t(online)",133 "RLDRAM test\t(offline)",134 "BIST Test\t(offline)"135};136 137static const char ethtool_xena_stats_keys[][ETH_GSTRING_LEN] = {138 {"tmac_frms"},139 {"tmac_data_octets"},140 {"tmac_drop_frms"},141 {"tmac_mcst_frms"},142 {"tmac_bcst_frms"},143 {"tmac_pause_ctrl_frms"},144 {"tmac_ttl_octets"},145 {"tmac_ucst_frms"},146 {"tmac_nucst_frms"},147 {"tmac_any_err_frms"},148 {"tmac_ttl_less_fb_octets"},149 {"tmac_vld_ip_octets"},150 {"tmac_vld_ip"},151 {"tmac_drop_ip"},152 {"tmac_icmp"},153 {"tmac_rst_tcp"},154 {"tmac_tcp"},155 {"tmac_udp"},156 {"rmac_vld_frms"},157 {"rmac_data_octets"},158 {"rmac_fcs_err_frms"},159 {"rmac_drop_frms"},160 {"rmac_vld_mcst_frms"},161 {"rmac_vld_bcst_frms"},162 {"rmac_in_rng_len_err_frms"},163 {"rmac_out_rng_len_err_frms"},164 {"rmac_long_frms"},165 {"rmac_pause_ctrl_frms"},166 {"rmac_unsup_ctrl_frms"},167 {"rmac_ttl_octets"},168 {"rmac_accepted_ucst_frms"},169 {"rmac_accepted_nucst_frms"},170 {"rmac_discarded_frms"},171 {"rmac_drop_events"},172 {"rmac_ttl_less_fb_octets"},173 {"rmac_ttl_frms"},174 {"rmac_usized_frms"},175 {"rmac_osized_frms"},176 {"rmac_frag_frms"},177 {"rmac_jabber_frms"},178 {"rmac_ttl_64_frms"},179 {"rmac_ttl_65_127_frms"},180 {"rmac_ttl_128_255_frms"},181 {"rmac_ttl_256_511_frms"},182 {"rmac_ttl_512_1023_frms"},183 {"rmac_ttl_1024_1518_frms"},184 {"rmac_ip"},185 {"rmac_ip_octets"},186 {"rmac_hdr_err_ip"},187 {"rmac_drop_ip"},188 {"rmac_icmp"},189 {"rmac_tcp"},190 {"rmac_udp"},191 {"rmac_err_drp_udp"},192 {"rmac_xgmii_err_sym"},193 {"rmac_frms_q0"},194 {"rmac_frms_q1"},195 {"rmac_frms_q2"},196 {"rmac_frms_q3"},197 {"rmac_frms_q4"},198 {"rmac_frms_q5"},199 {"rmac_frms_q6"},200 {"rmac_frms_q7"},201 {"rmac_full_q0"},202 {"rmac_full_q1"},203 {"rmac_full_q2"},204 {"rmac_full_q3"},205 {"rmac_full_q4"},206 {"rmac_full_q5"},207 {"rmac_full_q6"},208 {"rmac_full_q7"},209 {"rmac_pause_cnt"},210 {"rmac_xgmii_data_err_cnt"},211 {"rmac_xgmii_ctrl_err_cnt"},212 {"rmac_accepted_ip"},213 {"rmac_err_tcp"},214 {"rd_req_cnt"},215 {"new_rd_req_cnt"},216 {"new_rd_req_rtry_cnt"},217 {"rd_rtry_cnt"},218 {"wr_rtry_rd_ack_cnt"},219 {"wr_req_cnt"},220 {"new_wr_req_cnt"},221 {"new_wr_req_rtry_cnt"},222 {"wr_rtry_cnt"},223 {"wr_disc_cnt"},224 {"rd_rtry_wr_ack_cnt"},225 {"txp_wr_cnt"},226 {"txd_rd_cnt"},227 {"txd_wr_cnt"},228 {"rxd_rd_cnt"},229 {"rxd_wr_cnt"},230 {"txf_rd_cnt"},231 {"rxf_wr_cnt"}232};233 234static const char ethtool_enhanced_stats_keys[][ETH_GSTRING_LEN] = {235 {"rmac_ttl_1519_4095_frms"},236 {"rmac_ttl_4096_8191_frms"},237 {"rmac_ttl_8192_max_frms"},238 {"rmac_ttl_gt_max_frms"},239 {"rmac_osized_alt_frms"},240 {"rmac_jabber_alt_frms"},241 {"rmac_gt_max_alt_frms"},242 {"rmac_vlan_frms"},243 {"rmac_len_discard"},244 {"rmac_fcs_discard"},245 {"rmac_pf_discard"},246 {"rmac_da_discard"},247 {"rmac_red_discard"},248 {"rmac_rts_discard"},249 {"rmac_ingm_full_discard"},250 {"link_fault_cnt"}251};252 253static const char ethtool_driver_stats_keys[][ETH_GSTRING_LEN] = {254 {"\n DRIVER STATISTICS"},255 {"single_bit_ecc_errs"},256 {"double_bit_ecc_errs"},257 {"parity_err_cnt"},258 {"serious_err_cnt"},259 {"soft_reset_cnt"},260 {"fifo_full_cnt"},261 {"ring_0_full_cnt"},262 {"ring_1_full_cnt"},263 {"ring_2_full_cnt"},264 {"ring_3_full_cnt"},265 {"ring_4_full_cnt"},266 {"ring_5_full_cnt"},267 {"ring_6_full_cnt"},268 {"ring_7_full_cnt"},269 {"alarm_transceiver_temp_high"},270 {"alarm_transceiver_temp_low"},271 {"alarm_laser_bias_current_high"},272 {"alarm_laser_bias_current_low"},273 {"alarm_laser_output_power_high"},274 {"alarm_laser_output_power_low"},275 {"warn_transceiver_temp_high"},276 {"warn_transceiver_temp_low"},277 {"warn_laser_bias_current_high"},278 {"warn_laser_bias_current_low"},279 {"warn_laser_output_power_high"},280 {"warn_laser_output_power_low"},281 {"lro_aggregated_pkts"},282 {"lro_flush_both_count"},283 {"lro_out_of_sequence_pkts"},284 {"lro_flush_due_to_max_pkts"},285 {"lro_avg_aggr_pkts"},286 {"mem_alloc_fail_cnt"},287 {"pci_map_fail_cnt"},288 {"watchdog_timer_cnt"},289 {"mem_allocated"},290 {"mem_freed"},291 {"link_up_cnt"},292 {"link_down_cnt"},293 {"link_up_time"},294 {"link_down_time"},295 {"tx_tcode_buf_abort_cnt"},296 {"tx_tcode_desc_abort_cnt"},297 {"tx_tcode_parity_err_cnt"},298 {"tx_tcode_link_loss_cnt"},299 {"tx_tcode_list_proc_err_cnt"},300 {"rx_tcode_parity_err_cnt"},301 {"rx_tcode_abort_cnt"},302 {"rx_tcode_parity_abort_cnt"},303 {"rx_tcode_rda_fail_cnt"},304 {"rx_tcode_unkn_prot_cnt"},305 {"rx_tcode_fcs_err_cnt"},306 {"rx_tcode_buf_size_err_cnt"},307 {"rx_tcode_rxd_corrupt_cnt"},308 {"rx_tcode_unkn_err_cnt"},309 {"tda_err_cnt"},310 {"pfc_err_cnt"},311 {"pcc_err_cnt"},312 {"tti_err_cnt"},313 {"tpa_err_cnt"},314 {"sm_err_cnt"},315 {"lso_err_cnt"},316 {"mac_tmac_err_cnt"},317 {"mac_rmac_err_cnt"},318 {"xgxs_txgxs_err_cnt"},319 {"xgxs_rxgxs_err_cnt"},320 {"rc_err_cnt"},321 {"prc_pcix_err_cnt"},322 {"rpa_err_cnt"},323 {"rda_err_cnt"},324 {"rti_err_cnt"},325 {"mc_err_cnt"}326};327 328#define S2IO_XENA_STAT_LEN ARRAY_SIZE(ethtool_xena_stats_keys)329#define S2IO_ENHANCED_STAT_LEN ARRAY_SIZE(ethtool_enhanced_stats_keys)330#define S2IO_DRIVER_STAT_LEN ARRAY_SIZE(ethtool_driver_stats_keys)331 332#define XFRAME_I_STAT_LEN (S2IO_XENA_STAT_LEN + S2IO_DRIVER_STAT_LEN)333#define XFRAME_II_STAT_LEN (XFRAME_I_STAT_LEN + S2IO_ENHANCED_STAT_LEN)334 335#define XFRAME_I_STAT_STRINGS_LEN (XFRAME_I_STAT_LEN * ETH_GSTRING_LEN)336#define XFRAME_II_STAT_STRINGS_LEN (XFRAME_II_STAT_LEN * ETH_GSTRING_LEN)337 338#define S2IO_TEST_LEN ARRAY_SIZE(s2io_gstrings)339#define S2IO_STRINGS_LEN (S2IO_TEST_LEN * ETH_GSTRING_LEN)340 341/* copy mac addr to def_mac_addr array */342static void do_s2io_copy_mac_addr(struct s2io_nic *sp, int offset, u64 mac_addr)343{344 sp->def_mac_addr[offset].mac_addr[5] = (u8) (mac_addr);345 sp->def_mac_addr[offset].mac_addr[4] = (u8) (mac_addr >> 8);346 sp->def_mac_addr[offset].mac_addr[3] = (u8) (mac_addr >> 16);347 sp->def_mac_addr[offset].mac_addr[2] = (u8) (mac_addr >> 24);348 sp->def_mac_addr[offset].mac_addr[1] = (u8) (mac_addr >> 32);349 sp->def_mac_addr[offset].mac_addr[0] = (u8) (mac_addr >> 40);350}351 352/*353 * Constants to be programmed into the Xena's registers, to configure354 * the XAUI.355 */356 357#define END_SIGN 0x0358static const u64 herc_act_dtx_cfg[] = {359 /* Set address */360 0x8000051536750000ULL, 0x80000515367500E0ULL,361 /* Write data */362 0x8000051536750004ULL, 0x80000515367500E4ULL,363 /* Set address */364 0x80010515003F0000ULL, 0x80010515003F00E0ULL,365 /* Write data */366 0x80010515003F0004ULL, 0x80010515003F00E4ULL,367 /* Set address */368 0x801205150D440000ULL, 0x801205150D4400E0ULL,369 /* Write data */370 0x801205150D440004ULL, 0x801205150D4400E4ULL,371 /* Set address */372 0x80020515F2100000ULL, 0x80020515F21000E0ULL,373 /* Write data */374 0x80020515F2100004ULL, 0x80020515F21000E4ULL,375 /* Done */376 END_SIGN377};378 379static const u64 xena_dtx_cfg[] = {380 /* Set address */381 0x8000051500000000ULL, 0x80000515000000E0ULL,382 /* Write data */383 0x80000515D9350004ULL, 0x80000515D93500E4ULL,384 /* Set address */385 0x8001051500000000ULL, 0x80010515000000E0ULL,386 /* Write data */387 0x80010515001E0004ULL, 0x80010515001E00E4ULL,388 /* Set address */389 0x8002051500000000ULL, 0x80020515000000E0ULL,390 /* Write data */391 0x80020515F2100004ULL, 0x80020515F21000E4ULL,392 END_SIGN393};394 395/*396 * Constants for Fixing the MacAddress problem seen mostly on397 * Alpha machines.398 */399static const u64 fix_mac[] = {400 0x0060000000000000ULL, 0x0060600000000000ULL,401 0x0040600000000000ULL, 0x0000600000000000ULL,402 0x0020600000000000ULL, 0x0060600000000000ULL,403 0x0020600000000000ULL, 0x0060600000000000ULL,404 0x0020600000000000ULL, 0x0060600000000000ULL,405 0x0020600000000000ULL, 0x0060600000000000ULL,406 0x0020600000000000ULL, 0x0060600000000000ULL,407 0x0020600000000000ULL, 0x0060600000000000ULL,408 0x0020600000000000ULL, 0x0060600000000000ULL,409 0x0020600000000000ULL, 0x0060600000000000ULL,410 0x0020600000000000ULL, 0x0060600000000000ULL,411 0x0020600000000000ULL, 0x0060600000000000ULL,412 0x0020600000000000ULL, 0x0000600000000000ULL,413 0x0040600000000000ULL, 0x0060600000000000ULL,414 END_SIGN415};416 417MODULE_DESCRIPTION("Neterion 10GbE driver");418MODULE_LICENSE("GPL");419MODULE_VERSION(DRV_VERSION);420 421 422/* Module Loadable parameters. */423S2IO_PARM_INT(tx_fifo_num, FIFO_DEFAULT_NUM);424S2IO_PARM_INT(rx_ring_num, 1);425S2IO_PARM_INT(multiq, 0);426S2IO_PARM_INT(rx_ring_mode, 1);427S2IO_PARM_INT(use_continuous_tx_intrs, 1);428S2IO_PARM_INT(rmac_pause_time, 0x100);429S2IO_PARM_INT(mc_pause_threshold_q0q3, 187);430S2IO_PARM_INT(mc_pause_threshold_q4q7, 187);431S2IO_PARM_INT(shared_splits, 0);432S2IO_PARM_INT(tmac_util_period, 5);433S2IO_PARM_INT(rmac_util_period, 5);434S2IO_PARM_INT(l3l4hdr_size, 128);435/* 0 is no steering, 1 is Priority steering, 2 is Default steering */436S2IO_PARM_INT(tx_steering_type, TX_DEFAULT_STEERING);437/* Frequency of Rx desc syncs expressed as power of 2 */438S2IO_PARM_INT(rxsync_frequency, 3);439/* Interrupt type. Values can be 0(INTA), 2(MSI_X) */440S2IO_PARM_INT(intr_type, 2);441/* Large receive offload feature */442 443/* Max pkts to be aggregated by LRO at one time. If not specified,444 * aggregation happens until we hit max IP pkt size(64K)445 */446S2IO_PARM_INT(lro_max_pkts, 0xFFFF);447S2IO_PARM_INT(indicate_max_pkts, 0);448 449S2IO_PARM_INT(napi, 1);450S2IO_PARM_INT(vlan_tag_strip, NO_STRIP_IN_PROMISC);451 452static unsigned int tx_fifo_len[MAX_TX_FIFOS] =453{DEFAULT_FIFO_0_LEN, [1 ...(MAX_TX_FIFOS - 1)] = DEFAULT_FIFO_1_7_LEN};454static unsigned int rx_ring_sz[MAX_RX_RINGS] =455{[0 ...(MAX_RX_RINGS - 1)] = SMALL_BLK_CNT};456static unsigned int rts_frm_len[MAX_RX_RINGS] =457{[0 ...(MAX_RX_RINGS - 1)] = 0 };458 459module_param_array(tx_fifo_len, uint, NULL, 0);460module_param_array(rx_ring_sz, uint, NULL, 0);461module_param_array(rts_frm_len, uint, NULL, 0);462 463/*464 * S2IO device table.465 * This table lists all the devices that this driver supports.466 */467static const struct pci_device_id s2io_tbl[] = {468 {PCI_VENDOR_ID_S2IO, PCI_DEVICE_ID_S2IO_WIN,469 PCI_ANY_ID, PCI_ANY_ID},470 {PCI_VENDOR_ID_S2IO, PCI_DEVICE_ID_S2IO_UNI,471 PCI_ANY_ID, PCI_ANY_ID},472 {PCI_VENDOR_ID_S2IO, PCI_DEVICE_ID_HERC_WIN,473 PCI_ANY_ID, PCI_ANY_ID},474 {PCI_VENDOR_ID_S2IO, PCI_DEVICE_ID_HERC_UNI,475 PCI_ANY_ID, PCI_ANY_ID},476 {0,}477};478 479MODULE_DEVICE_TABLE(pci, s2io_tbl);480 481static const struct pci_error_handlers s2io_err_handler = {482 .error_detected = s2io_io_error_detected,483 .slot_reset = s2io_io_slot_reset,484 .resume = s2io_io_resume,485};486 487static struct pci_driver s2io_driver = {488 .name = "S2IO",489 .id_table = s2io_tbl,490 .probe = s2io_init_nic,491 .remove = s2io_rem_nic,492 .err_handler = &s2io_err_handler,493};494 495/* A simplifier macro used both by init and free shared_mem Fns(). */496#define TXD_MEM_PAGE_CNT(len, per_each) DIV_ROUND_UP(len, per_each)497 498/* netqueue manipulation helper functions */499static inline void s2io_stop_all_tx_queue(struct s2io_nic *sp)500{501 if (!sp->config.multiq) {502 int i;503 504 for (i = 0; i < sp->config.tx_fifo_num; i++)505 sp->mac_control.fifos[i].queue_state = FIFO_QUEUE_STOP;506 }507 netif_tx_stop_all_queues(sp->dev);508}509 510static inline void s2io_stop_tx_queue(struct s2io_nic *sp, int fifo_no)511{512 if (!sp->config.multiq)513 sp->mac_control.fifos[fifo_no].queue_state =514 FIFO_QUEUE_STOP;515 516 netif_tx_stop_all_queues(sp->dev);517}518 519static inline void s2io_start_all_tx_queue(struct s2io_nic *sp)520{521 if (!sp->config.multiq) {522 int i;523 524 for (i = 0; i < sp->config.tx_fifo_num; i++)525 sp->mac_control.fifos[i].queue_state = FIFO_QUEUE_START;526 }527 netif_tx_start_all_queues(sp->dev);528}529 530static inline void s2io_wake_all_tx_queue(struct s2io_nic *sp)531{532 if (!sp->config.multiq) {533 int i;534 535 for (i = 0; i < sp->config.tx_fifo_num; i++)536 sp->mac_control.fifos[i].queue_state = FIFO_QUEUE_START;537 }538 netif_tx_wake_all_queues(sp->dev);539}540 541static inline void s2io_wake_tx_queue(542 struct fifo_info *fifo, int cnt, u8 multiq)543{544 545 if (multiq) {546 if (cnt && __netif_subqueue_stopped(fifo->dev, fifo->fifo_no))547 netif_wake_subqueue(fifo->dev, fifo->fifo_no);548 } else if (cnt && (fifo->queue_state == FIFO_QUEUE_STOP)) {549 if (netif_queue_stopped(fifo->dev)) {550 fifo->queue_state = FIFO_QUEUE_START;551 netif_wake_queue(fifo->dev);552 }553 }554}555 556/**557 * init_shared_mem - Allocation and Initialization of Memory558 * @nic: Device private variable.559 * Description: The function allocates all the memory areas shared560 * between the NIC and the driver. This includes Tx descriptors,561 * Rx descriptors and the statistics block.562 */563 564static int init_shared_mem(struct s2io_nic *nic)565{566 u32 size;567 void *tmp_v_addr, *tmp_v_addr_next;568 dma_addr_t tmp_p_addr, tmp_p_addr_next;569 struct RxD_block *pre_rxd_blk = NULL;570 int i, j, blk_cnt;571 int lst_size, lst_per_page;572 struct net_device *dev = nic->dev;573 unsigned long tmp;574 struct buffAdd *ba;575 struct config_param *config = &nic->config;576 struct mac_info *mac_control = &nic->mac_control;577 unsigned long long mem_allocated = 0;578 579 /* Allocation and initialization of TXDLs in FIFOs */580 size = 0;581 for (i = 0; i < config->tx_fifo_num; i++) {582 struct tx_fifo_config *tx_cfg = &config->tx_cfg[i];583 584 size += tx_cfg->fifo_len;585 }586 if (size > MAX_AVAILABLE_TXDS) {587 DBG_PRINT(ERR_DBG,588 "Too many TxDs requested: %d, max supported: %d\n",589 size, MAX_AVAILABLE_TXDS);590 return -EINVAL;591 }592 593 size = 0;594 for (i = 0; i < config->tx_fifo_num; i++) {595 struct tx_fifo_config *tx_cfg = &config->tx_cfg[i];596 597 size = tx_cfg->fifo_len;598 /*599 * Legal values are from 2 to 8192600 */601 if (size < 2) {602 DBG_PRINT(ERR_DBG, "Fifo %d: Invalid length (%d) - "603 "Valid lengths are 2 through 8192\n",604 i, size);605 return -EINVAL;606 }607 }608 609 lst_size = (sizeof(struct TxD) * config->max_txds);610 lst_per_page = PAGE_SIZE / lst_size;611 612 for (i = 0; i < config->tx_fifo_num; i++) {613 struct fifo_info *fifo = &mac_control->fifos[i];614 struct tx_fifo_config *tx_cfg = &config->tx_cfg[i];615 int fifo_len = tx_cfg->fifo_len;616 int list_holder_size = fifo_len * sizeof(struct list_info_hold);617 618 fifo->list_info = kzalloc(list_holder_size, GFP_KERNEL);619 if (!fifo->list_info) {620 DBG_PRINT(INFO_DBG, "Malloc failed for list_info\n");621 return -ENOMEM;622 }623 mem_allocated += list_holder_size;624 }625 for (i = 0; i < config->tx_fifo_num; i++) {626 int page_num = TXD_MEM_PAGE_CNT(config->tx_cfg[i].fifo_len,627 lst_per_page);628 struct fifo_info *fifo = &mac_control->fifos[i];629 struct tx_fifo_config *tx_cfg = &config->tx_cfg[i];630 631 fifo->tx_curr_put_info.offset = 0;632 fifo->tx_curr_put_info.fifo_len = tx_cfg->fifo_len - 1;633 fifo->tx_curr_get_info.offset = 0;634 fifo->tx_curr_get_info.fifo_len = tx_cfg->fifo_len - 1;635 fifo->fifo_no = i;636 fifo->nic = nic;637 fifo->max_txds = MAX_SKB_FRAGS + 2;638 fifo->dev = dev;639 640 for (j = 0; j < page_num; j++) {641 int k = 0;642 dma_addr_t tmp_p;643 void *tmp_v;644 tmp_v = dma_alloc_coherent(&nic->pdev->dev, PAGE_SIZE,645 &tmp_p, GFP_KERNEL);646 if (!tmp_v) {647 DBG_PRINT(INFO_DBG,648 "dma_alloc_coherent failed for TxDL\n");649 return -ENOMEM;650 }651 /* If we got a zero DMA address(can happen on652 * certain platforms like PPC), reallocate.653 * Store virtual address of page we don't want,654 * to be freed later.655 */656 if (!tmp_p) {657 mac_control->zerodma_virt_addr = tmp_v;658 DBG_PRINT(INIT_DBG,659 "%s: Zero DMA address for TxDL. "660 "Virtual address %p\n",661 dev->name, tmp_v);662 tmp_v = dma_alloc_coherent(&nic->pdev->dev,663 PAGE_SIZE, &tmp_p,664 GFP_KERNEL);665 if (!tmp_v) {666 DBG_PRINT(INFO_DBG,667 "dma_alloc_coherent failed for TxDL\n");668 return -ENOMEM;669 }670 mem_allocated += PAGE_SIZE;671 }672 while (k < lst_per_page) {673 int l = (j * lst_per_page) + k;674 if (l == tx_cfg->fifo_len)675 break;676 fifo->list_info[l].list_virt_addr =677 tmp_v + (k * lst_size);678 fifo->list_info[l].list_phy_addr =679 tmp_p + (k * lst_size);680 k++;681 }682 }683 }684 685 for (i = 0; i < config->tx_fifo_num; i++) {686 struct fifo_info *fifo = &mac_control->fifos[i];687 struct tx_fifo_config *tx_cfg = &config->tx_cfg[i];688 689 size = tx_cfg->fifo_len;690 fifo->ufo_in_band_v = kcalloc(size, sizeof(u64), GFP_KERNEL);691 if (!fifo->ufo_in_band_v)692 return -ENOMEM;693 mem_allocated += (size * sizeof(u64));694 }695 696 /* Allocation and initialization of RXDs in Rings */697 size = 0;698 for (i = 0; i < config->rx_ring_num; i++) {699 struct rx_ring_config *rx_cfg = &config->rx_cfg[i];700 struct ring_info *ring = &mac_control->rings[i];701 702 if (rx_cfg->num_rxd % (rxd_count[nic->rxd_mode] + 1)) {703 DBG_PRINT(ERR_DBG, "%s: Ring%d RxD count is not a "704 "multiple of RxDs per Block\n",705 dev->name, i);706 return FAILURE;707 }708 size += rx_cfg->num_rxd;709 ring->block_count = rx_cfg->num_rxd /710 (rxd_count[nic->rxd_mode] + 1);711 ring->pkt_cnt = rx_cfg->num_rxd - ring->block_count;712 }713 if (nic->rxd_mode == RXD_MODE_1)714 size = (size * (sizeof(struct RxD1)));715 else716 size = (size * (sizeof(struct RxD3)));717 718 for (i = 0; i < config->rx_ring_num; i++) {719 struct rx_ring_config *rx_cfg = &config->rx_cfg[i];720 struct ring_info *ring = &mac_control->rings[i];721 722 ring->rx_curr_get_info.block_index = 0;723 ring->rx_curr_get_info.offset = 0;724 ring->rx_curr_get_info.ring_len = rx_cfg->num_rxd - 1;725 ring->rx_curr_put_info.block_index = 0;726 ring->rx_curr_put_info.offset = 0;727 ring->rx_curr_put_info.ring_len = rx_cfg->num_rxd - 1;728 ring->nic = nic;729 ring->ring_no = i;730 731 blk_cnt = rx_cfg->num_rxd / (rxd_count[nic->rxd_mode] + 1);732 /* Allocating all the Rx blocks */733 for (j = 0; j < blk_cnt; j++) {734 struct rx_block_info *rx_blocks;735 int l;736 737 rx_blocks = &ring->rx_blocks[j];738 size = SIZE_OF_BLOCK; /* size is always page size */739 tmp_v_addr = dma_alloc_coherent(&nic->pdev->dev, size,740 &tmp_p_addr, GFP_KERNEL);741 if (tmp_v_addr == NULL) {742 /*743 * In case of failure, free_shared_mem()744 * is called, which should free any745 * memory that was alloced till the746 * failure happened.747 */748 rx_blocks->block_virt_addr = tmp_v_addr;749 return -ENOMEM;750 }751 mem_allocated += size;752 753 size = sizeof(struct rxd_info) *754 rxd_count[nic->rxd_mode];755 rx_blocks->block_virt_addr = tmp_v_addr;756 rx_blocks->block_dma_addr = tmp_p_addr;757 rx_blocks->rxds = kmalloc(size, GFP_KERNEL);758 if (!rx_blocks->rxds)759 return -ENOMEM;760 mem_allocated += size;761 for (l = 0; l < rxd_count[nic->rxd_mode]; l++) {762 rx_blocks->rxds[l].virt_addr =763 rx_blocks->block_virt_addr +764 (rxd_size[nic->rxd_mode] * l);765 rx_blocks->rxds[l].dma_addr =766 rx_blocks->block_dma_addr +767 (rxd_size[nic->rxd_mode] * l);768 }769 }770 /* Interlinking all Rx Blocks */771 for (j = 0; j < blk_cnt; j++) {772 int next = (j + 1) % blk_cnt;773 tmp_v_addr = ring->rx_blocks[j].block_virt_addr;774 tmp_v_addr_next = ring->rx_blocks[next].block_virt_addr;775 tmp_p_addr = ring->rx_blocks[j].block_dma_addr;776 tmp_p_addr_next = ring->rx_blocks[next].block_dma_addr;777 778 pre_rxd_blk = tmp_v_addr;779 pre_rxd_blk->reserved_2_pNext_RxD_block =780 (unsigned long)tmp_v_addr_next;781 pre_rxd_blk->pNext_RxD_Blk_physical =782 (u64)tmp_p_addr_next;783 }784 }785 if (nic->rxd_mode == RXD_MODE_3B) {786 /*787 * Allocation of Storages for buffer addresses in 2BUFF mode788 * and the buffers as well.789 */790 for (i = 0; i < config->rx_ring_num; i++) {791 struct rx_ring_config *rx_cfg = &config->rx_cfg[i];792 struct ring_info *ring = &mac_control->rings[i];793 794 blk_cnt = rx_cfg->num_rxd /795 (rxd_count[nic->rxd_mode] + 1);796 size = sizeof(struct buffAdd *) * blk_cnt;797 ring->ba = kmalloc(size, GFP_KERNEL);798 if (!ring->ba)799 return -ENOMEM;800 mem_allocated += size;801 for (j = 0; j < blk_cnt; j++) {802 int k = 0;803 804 size = sizeof(struct buffAdd) *805 (rxd_count[nic->rxd_mode] + 1);806 ring->ba[j] = kmalloc(size, GFP_KERNEL);807 if (!ring->ba[j])808 return -ENOMEM;809 mem_allocated += size;810 while (k != rxd_count[nic->rxd_mode]) {811 ba = &ring->ba[j][k];812 size = BUF0_LEN + ALIGN_SIZE;813 ba->ba_0_org = kmalloc(size, GFP_KERNEL);814 if (!ba->ba_0_org)815 return -ENOMEM;816 mem_allocated += size;817 tmp = (unsigned long)ba->ba_0_org;818 tmp += ALIGN_SIZE;819 tmp &= ~((unsigned long)ALIGN_SIZE);820 ba->ba_0 = (void *)tmp;821 822 size = BUF1_LEN + ALIGN_SIZE;823 ba->ba_1_org = kmalloc(size, GFP_KERNEL);824 if (!ba->ba_1_org)825 return -ENOMEM;826 mem_allocated += size;827 tmp = (unsigned long)ba->ba_1_org;828 tmp += ALIGN_SIZE;829 tmp &= ~((unsigned long)ALIGN_SIZE);830 ba->ba_1 = (void *)tmp;831 k++;832 }833 }834 }835 }836 837 /* Allocation and initialization of Statistics block */838 size = sizeof(struct stat_block);839 mac_control->stats_mem =840 dma_alloc_coherent(&nic->pdev->dev, size,841 &mac_control->stats_mem_phy, GFP_KERNEL);842 843 if (!mac_control->stats_mem) {844 /*845 * In case of failure, free_shared_mem() is called, which846 * should free any memory that was alloced till the847 * failure happened.848 */849 return -ENOMEM;850 }851 mem_allocated += size;852 mac_control->stats_mem_sz = size;853 854 tmp_v_addr = mac_control->stats_mem;855 mac_control->stats_info = tmp_v_addr;856 memset(tmp_v_addr, 0, size);857 DBG_PRINT(INIT_DBG, "%s: Ring Mem PHY: 0x%llx\n",858 dev_name(&nic->pdev->dev), (unsigned long long)tmp_p_addr);859 mac_control->stats_info->sw_stat.mem_allocated += mem_allocated;860 return SUCCESS;861}862 863/**864 * free_shared_mem - Free the allocated Memory865 * @nic: Device private variable.866 * Description: This function is to free all memory locations allocated by867 * the init_shared_mem() function and return it to the kernel.868 */869 870static void free_shared_mem(struct s2io_nic *nic)871{872 int i, j, blk_cnt, size;873 void *tmp_v_addr;874 dma_addr_t tmp_p_addr;875 int lst_size, lst_per_page;876 struct net_device *dev;877 int page_num = 0;878 struct config_param *config;879 struct mac_info *mac_control;880 struct stat_block *stats;881 struct swStat *swstats;882 883 if (!nic)884 return;885 886 dev = nic->dev;887 888 config = &nic->config;889 mac_control = &nic->mac_control;890 stats = mac_control->stats_info;891 swstats = &stats->sw_stat;892 893 lst_size = sizeof(struct TxD) * config->max_txds;894 lst_per_page = PAGE_SIZE / lst_size;895 896 for (i = 0; i < config->tx_fifo_num; i++) {897 struct fifo_info *fifo = &mac_control->fifos[i];898 struct tx_fifo_config *tx_cfg = &config->tx_cfg[i];899 900 page_num = TXD_MEM_PAGE_CNT(tx_cfg->fifo_len, lst_per_page);901 for (j = 0; j < page_num; j++) {902 int mem_blks = (j * lst_per_page);903 struct list_info_hold *fli;904 905 if (!fifo->list_info)906 return;907 908 fli = &fifo->list_info[mem_blks];909 if (!fli->list_virt_addr)910 break;911 dma_free_coherent(&nic->pdev->dev, PAGE_SIZE,912 fli->list_virt_addr,913 fli->list_phy_addr);914 swstats->mem_freed += PAGE_SIZE;915 }916 /* If we got a zero DMA address during allocation,917 * free the page now918 */919 if (mac_control->zerodma_virt_addr) {920 dma_free_coherent(&nic->pdev->dev, PAGE_SIZE,921 mac_control->zerodma_virt_addr,922 (dma_addr_t)0);923 DBG_PRINT(INIT_DBG,924 "%s: Freeing TxDL with zero DMA address. "925 "Virtual address %p\n",926 dev->name, mac_control->zerodma_virt_addr);927 swstats->mem_freed += PAGE_SIZE;928 }929 kfree(fifo->list_info);930 swstats->mem_freed += tx_cfg->fifo_len *931 sizeof(struct list_info_hold);932 }933 934 size = SIZE_OF_BLOCK;935 for (i = 0; i < config->rx_ring_num; i++) {936 struct ring_info *ring = &mac_control->rings[i];937 938 blk_cnt = ring->block_count;939 for (j = 0; j < blk_cnt; j++) {940 tmp_v_addr = ring->rx_blocks[j].block_virt_addr;941 tmp_p_addr = ring->rx_blocks[j].block_dma_addr;942 if (tmp_v_addr == NULL)943 break;944 dma_free_coherent(&nic->pdev->dev, size, tmp_v_addr,945 tmp_p_addr);946 swstats->mem_freed += size;947 kfree(ring->rx_blocks[j].rxds);948 swstats->mem_freed += sizeof(struct rxd_info) *949 rxd_count[nic->rxd_mode];950 }951 }952 953 if (nic->rxd_mode == RXD_MODE_3B) {954 /* Freeing buffer storage addresses in 2BUFF mode. */955 for (i = 0; i < config->rx_ring_num; i++) {956 struct rx_ring_config *rx_cfg = &config->rx_cfg[i];957 struct ring_info *ring = &mac_control->rings[i];958 959 blk_cnt = rx_cfg->num_rxd /960 (rxd_count[nic->rxd_mode] + 1);961 for (j = 0; j < blk_cnt; j++) {962 int k = 0;963 if (!ring->ba[j])964 continue;965 while (k != rxd_count[nic->rxd_mode]) {966 struct buffAdd *ba = &ring->ba[j][k];967 kfree(ba->ba_0_org);968 swstats->mem_freed +=969 BUF0_LEN + ALIGN_SIZE;970 kfree(ba->ba_1_org);971 swstats->mem_freed +=972 BUF1_LEN + ALIGN_SIZE;973 k++;974 }975 kfree(ring->ba[j]);976 swstats->mem_freed += sizeof(struct buffAdd) *977 (rxd_count[nic->rxd_mode] + 1);978 }979 kfree(ring->ba);980 swstats->mem_freed += sizeof(struct buffAdd *) *981 blk_cnt;982 }983 }984 985 for (i = 0; i < nic->config.tx_fifo_num; i++) {986 struct fifo_info *fifo = &mac_control->fifos[i];987 struct tx_fifo_config *tx_cfg = &config->tx_cfg[i];988 989 if (fifo->ufo_in_band_v) {990 swstats->mem_freed += tx_cfg->fifo_len *991 sizeof(u64);992 kfree(fifo->ufo_in_band_v);993 }994 }995 996 if (mac_control->stats_mem) {997 swstats->mem_freed += mac_control->stats_mem_sz;998 dma_free_coherent(&nic->pdev->dev, mac_control->stats_mem_sz,999 mac_control->stats_mem,1000 mac_control->stats_mem_phy);1001 }1002}1003 1004/*1005 * s2io_verify_pci_mode -1006 */1007 1008static int s2io_verify_pci_mode(struct s2io_nic *nic)1009{1010 struct XENA_dev_config __iomem *bar0 = nic->bar0;1011 register u64 val64 = 0;1012 int mode;1013 1014 val64 = readq(&bar0->pci_mode);1015 mode = (u8)GET_PCI_MODE(val64);1016 1017 if (val64 & PCI_MODE_UNKNOWN_MODE)1018 return -1; /* Unknown PCI mode */1019 return mode;1020}1021 1022#define NEC_VENID 0x10331023#define NEC_DEVID 0x01251024static int s2io_on_nec_bridge(struct pci_dev *s2io_pdev)1025{1026 struct pci_dev *tdev = NULL;1027 for_each_pci_dev(tdev) {1028 if (tdev->vendor == NEC_VENID && tdev->device == NEC_DEVID) {1029 if (tdev->bus == s2io_pdev->bus->parent) {1030 pci_dev_put(tdev);1031 return 1;1032 }1033 }1034 }1035 return 0;1036}1037 1038static int bus_speed[8] = {33, 133, 133, 200, 266, 133, 200, 266};1039/*1040 * s2io_print_pci_mode -1041 */1042static int s2io_print_pci_mode(struct s2io_nic *nic)1043{1044 struct XENA_dev_config __iomem *bar0 = nic->bar0;1045 register u64 val64 = 0;1046 int mode;1047 struct config_param *config = &nic->config;1048 const char *pcimode;1049 1050 val64 = readq(&bar0->pci_mode);1051 mode = (u8)GET_PCI_MODE(val64);1052 1053 if (val64 & PCI_MODE_UNKNOWN_MODE)1054 return -1; /* Unknown PCI mode */1055 1056 config->bus_speed = bus_speed[mode];1057 1058 if (s2io_on_nec_bridge(nic->pdev)) {1059 DBG_PRINT(ERR_DBG, "%s: Device is on PCI-E bus\n",1060 nic->dev->name);1061 return mode;1062 }1063 1064 switch (mode) {1065 case PCI_MODE_PCI_33:1066 pcimode = "33MHz PCI bus";1067 break;1068 case PCI_MODE_PCI_66:1069 pcimode = "66MHz PCI bus";1070 break;1071 case PCI_MODE_PCIX_M1_66:1072 pcimode = "66MHz PCIX(M1) bus";1073 break;1074 case PCI_MODE_PCIX_M1_100:1075 pcimode = "100MHz PCIX(M1) bus";1076 break;1077 case PCI_MODE_PCIX_M1_133:1078 pcimode = "133MHz PCIX(M1) bus";1079 break;1080 case PCI_MODE_PCIX_M2_66:1081 pcimode = "133MHz PCIX(M2) bus";1082 break;1083 case PCI_MODE_PCIX_M2_100:1084 pcimode = "200MHz PCIX(M2) bus";1085 break;1086 case PCI_MODE_PCIX_M2_133:1087 pcimode = "266MHz PCIX(M2) bus";1088 break;1089 default:1090 pcimode = "unsupported bus!";1091 mode = -1;1092 }1093 1094 DBG_PRINT(ERR_DBG, "%s: Device is on %d bit %s\n",1095 nic->dev->name, val64 & PCI_MODE_32_BITS ? 32 : 64, pcimode);1096 1097 return mode;1098}1099 1100/**1101 * init_tti - Initialization transmit traffic interrupt scheme1102 * @nic: device private variable1103 * @link: link status (UP/DOWN) used to enable/disable continuous1104 * transmit interrupts1105 * @may_sleep: parameter indicates if sleeping when waiting for1106 * command complete1107 * Description: The function configures transmit traffic interrupts1108 * Return Value: SUCCESS on success and1109 * '-1' on failure1110 */1111 1112static int init_tti(struct s2io_nic *nic, int link, bool may_sleep)1113{1114 struct XENA_dev_config __iomem *bar0 = nic->bar0;1115 register u64 val64 = 0;1116 int i;1117 struct config_param *config = &nic->config;1118 1119 for (i = 0; i < config->tx_fifo_num; i++) {1120 /*1121 * TTI Initialization. Default Tx timer gets us about1122 * 250 interrupts per sec. Continuous interrupts are enabled1123 * by default.1124 */1125 if (nic->device_type == XFRAME_II_DEVICE) {1126 int count = (nic->config.bus_speed * 125)/2;1127 val64 = TTI_DATA1_MEM_TX_TIMER_VAL(count);1128 } else1129 val64 = TTI_DATA1_MEM_TX_TIMER_VAL(0x2078);1130 1131 val64 |= TTI_DATA1_MEM_TX_URNG_A(0xA) |1132 TTI_DATA1_MEM_TX_URNG_B(0x10) |1133 TTI_DATA1_MEM_TX_URNG_C(0x30) |1134 TTI_DATA1_MEM_TX_TIMER_AC_EN;1135 if (i == 0)1136 if (use_continuous_tx_intrs && (link == LINK_UP))1137 val64 |= TTI_DATA1_MEM_TX_TIMER_CI_EN;1138 writeq(val64, &bar0->tti_data1_mem);1139 1140 if (nic->config.intr_type == MSI_X) {1141 val64 = TTI_DATA2_MEM_TX_UFC_A(0x10) |1142 TTI_DATA2_MEM_TX_UFC_B(0x100) |1143 TTI_DATA2_MEM_TX_UFC_C(0x200) |1144 TTI_DATA2_MEM_TX_UFC_D(0x300);1145 } else {1146 if ((nic->config.tx_steering_type ==1147 TX_DEFAULT_STEERING) &&1148 (config->tx_fifo_num > 1) &&1149 (i >= nic->udp_fifo_idx) &&1150 (i < (nic->udp_fifo_idx +1151 nic->total_udp_fifos)))1152 val64 = TTI_DATA2_MEM_TX_UFC_A(0x50) |1153 TTI_DATA2_MEM_TX_UFC_B(0x80) |1154 TTI_DATA2_MEM_TX_UFC_C(0x100) |1155 TTI_DATA2_MEM_TX_UFC_D(0x120);1156 else1157 val64 = TTI_DATA2_MEM_TX_UFC_A(0x10) |1158 TTI_DATA2_MEM_TX_UFC_B(0x20) |1159 TTI_DATA2_MEM_TX_UFC_C(0x40) |1160 TTI_DATA2_MEM_TX_UFC_D(0x80);1161 }1162 1163 writeq(val64, &bar0->tti_data2_mem);1164 1165 val64 = TTI_CMD_MEM_WE |1166 TTI_CMD_MEM_STROBE_NEW_CMD |1167 TTI_CMD_MEM_OFFSET(i);1168 writeq(val64, &bar0->tti_command_mem);1169 1170 if (wait_for_cmd_complete(&bar0->tti_command_mem,1171 TTI_CMD_MEM_STROBE_NEW_CMD,1172 S2IO_BIT_RESET, may_sleep) != SUCCESS)1173 return FAILURE;1174 }1175 1176 return SUCCESS;1177}1178 1179/**1180 * init_nic - Initialization of hardware1181 * @nic: device private variable1182 * Description: The function sequentially configures every block1183 * of the H/W from their reset values.1184 * Return Value: SUCCESS on success and1185 * '-1' on failure (endian settings incorrect).1186 */1187 1188static int init_nic(struct s2io_nic *nic)1189{1190 struct XENA_dev_config __iomem *bar0 = nic->bar0;1191 struct net_device *dev = nic->dev;1192 register u64 val64 = 0;1193 void __iomem *add;1194 u32 time;1195 int i, j;1196 int dtx_cnt = 0;1197 unsigned long long mem_share;1198 int mem_size;1199 struct config_param *config = &nic->config;1200 struct mac_info *mac_control = &nic->mac_control;1201 1202 /* to set the swapper controle on the card */1203 if (s2io_set_swapper(nic)) {1204 DBG_PRINT(ERR_DBG, "ERROR: Setting Swapper failed\n");1205 return -EIO;1206 }1207 1208 /*1209 * Herc requires EOI to be removed from reset before XGXS, so..1210 */1211 if (nic->device_type & XFRAME_II_DEVICE) {1212 val64 = 0xA500000000ULL;1213 writeq(val64, &bar0->sw_reset);1214 msleep(500);1215 val64 = readq(&bar0->sw_reset);1216 }1217 1218 /* Remove XGXS from reset state */1219 val64 = 0;1220 writeq(val64, &bar0->sw_reset);1221 msleep(500);1222 val64 = readq(&bar0->sw_reset);1223 1224 /* Ensure that it's safe to access registers by checking1225 * RIC_RUNNING bit is reset. Check is valid only for XframeII.1226 */1227 if (nic->device_type == XFRAME_II_DEVICE) {1228 for (i = 0; i < 50; i++) {1229 val64 = readq(&bar0->adapter_status);1230 if (!(val64 & ADAPTER_STATUS_RIC_RUNNING))1231 break;1232 msleep(10);1233 }1234 if (i == 50)1235 return -ENODEV;1236 }1237 1238 /* Enable Receiving broadcasts */1239 add = &bar0->mac_cfg;1240 val64 = readq(&bar0->mac_cfg);1241 val64 |= MAC_RMAC_BCAST_ENABLE;1242 writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key);1243 writel((u32)val64, add);1244 writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key);1245 writel((u32) (val64 >> 32), (add + 4));1246 1247 /* Read registers in all blocks */1248 val64 = readq(&bar0->mac_int_mask);1249 val64 = readq(&bar0->mc_int_mask);1250 val64 = readq(&bar0->xgxs_int_mask);1251 1252 /* Set MTU */1253 val64 = dev->mtu;1254 writeq(vBIT(val64, 2, 14), &bar0->rmac_max_pyld_len);1255 1256 if (nic->device_type & XFRAME_II_DEVICE) {1257 while (herc_act_dtx_cfg[dtx_cnt] != END_SIGN) {1258 SPECIAL_REG_WRITE(herc_act_dtx_cfg[dtx_cnt],1259 &bar0->dtx_control, UF);1260 if (dtx_cnt & 0x1)1261 msleep(1); /* Necessary!! */1262 dtx_cnt++;1263 }1264 } else {1265 while (xena_dtx_cfg[dtx_cnt] != END_SIGN) {1266 SPECIAL_REG_WRITE(xena_dtx_cfg[dtx_cnt],1267 &bar0->dtx_control, UF);1268 val64 = readq(&bar0->dtx_control);1269 dtx_cnt++;1270 }1271 }1272 1273 /* Tx DMA Initialization */1274 val64 = 0;1275 writeq(val64, &bar0->tx_fifo_partition_0);1276 writeq(val64, &bar0->tx_fifo_partition_1);1277 writeq(val64, &bar0->tx_fifo_partition_2);1278 writeq(val64, &bar0->tx_fifo_partition_3);1279 1280 for (i = 0, j = 0; i < config->tx_fifo_num; i++) {1281 struct tx_fifo_config *tx_cfg = &config->tx_cfg[i];1282 1283 val64 |= vBIT(tx_cfg->fifo_len - 1, ((j * 32) + 19), 13) |1284 vBIT(tx_cfg->fifo_priority, ((j * 32) + 5), 3);1285 1286 if (i == (config->tx_fifo_num - 1)) {1287 if (i % 2 == 0)1288 i++;1289 }1290 1291 switch (i) {1292 case 1:1293 writeq(val64, &bar0->tx_fifo_partition_0);1294 val64 = 0;1295 j = 0;1296 break;1297 case 3:1298 writeq(val64, &bar0->tx_fifo_partition_1);1299 val64 = 0;1300 j = 0;1301 break;1302 case 5:1303 writeq(val64, &bar0->tx_fifo_partition_2);1304 val64 = 0;1305 j = 0;1306 break;1307 case 7:1308 writeq(val64, &bar0->tx_fifo_partition_3);1309 val64 = 0;1310 j = 0;1311 break;1312 default:1313 j++;1314 break;1315 }1316 }1317 1318 /*1319 * Disable 4 PCCs for Xena1, 2 and 3 as per H/W bug1320 * SXE-008 TRANSMIT DMA ARBITRATION ISSUE.1321 */1322 if ((nic->device_type == XFRAME_I_DEVICE) && (nic->pdev->revision < 4))1323 writeq(PCC_ENABLE_FOUR, &bar0->pcc_enable);1324 1325 val64 = readq(&bar0->tx_fifo_partition_0);1326 DBG_PRINT(INIT_DBG, "Fifo partition at: 0x%p is: 0x%llx\n",1327 &bar0->tx_fifo_partition_0, (unsigned long long)val64);1328 1329 /*1330 * Initialization of Tx_PA_CONFIG register to ignore packet1331 * integrity checking.1332 */1333 val64 = readq(&bar0->tx_pa_cfg);1334 val64 |= TX_PA_CFG_IGNORE_FRM_ERR |1335 TX_PA_CFG_IGNORE_SNAP_OUI |1336 TX_PA_CFG_IGNORE_LLC_CTRL |1337 TX_PA_CFG_IGNORE_L2_ERR;1338 writeq(val64, &bar0->tx_pa_cfg);1339 1340 /* Rx DMA initialization. */1341 val64 = 0;1342 for (i = 0; i < config->rx_ring_num; i++) {1343 struct rx_ring_config *rx_cfg = &config->rx_cfg[i];1344 1345 val64 |= vBIT(rx_cfg->ring_priority, (5 + (i * 8)), 3);1346 }1347 writeq(val64, &bar0->rx_queue_priority);1348 1349 /*1350 * Allocating equal share of memory to all the1351 * configured Rings.1352 */1353 val64 = 0;1354 if (nic->device_type & XFRAME_II_DEVICE)1355 mem_size = 32;1356 else1357 mem_size = 64;1358 1359 for (i = 0; i < config->rx_ring_num; i++) {1360 switch (i) {1361 case 0:1362 mem_share = (mem_size / config->rx_ring_num +1363 mem_size % config->rx_ring_num);1364 val64 |= RX_QUEUE_CFG_Q0_SZ(mem_share);1365 continue;1366 case 1:1367 mem_share = (mem_size / config->rx_ring_num);1368 val64 |= RX_QUEUE_CFG_Q1_SZ(mem_share);1369 continue;1370 case 2:1371 mem_share = (mem_size / config->rx_ring_num);1372 val64 |= RX_QUEUE_CFG_Q2_SZ(mem_share);1373 continue;1374 case 3:1375 mem_share = (mem_size / config->rx_ring_num);1376 val64 |= RX_QUEUE_CFG_Q3_SZ(mem_share);1377 continue;1378 case 4:1379 mem_share = (mem_size / config->rx_ring_num);1380 val64 |= RX_QUEUE_CFG_Q4_SZ(mem_share);1381 continue;1382 case 5:1383 mem_share = (mem_size / config->rx_ring_num);1384 val64 |= RX_QUEUE_CFG_Q5_SZ(mem_share);1385 continue;1386 case 6:1387 mem_share = (mem_size / config->rx_ring_num);1388 val64 |= RX_QUEUE_CFG_Q6_SZ(mem_share);1389 continue;1390 case 7:1391 mem_share = (mem_size / config->rx_ring_num);1392 val64 |= RX_QUEUE_CFG_Q7_SZ(mem_share);1393 continue;1394 }1395 }1396 writeq(val64, &bar0->rx_queue_cfg);1397 1398 /*1399 * Filling Tx round robin registers1400 * as per the number of FIFOs for equal scheduling priority1401 */1402 switch (config->tx_fifo_num) {1403 case 1:1404 val64 = 0x0;1405 writeq(val64, &bar0->tx_w_round_robin_0);1406 writeq(val64, &bar0->tx_w_round_robin_1);1407 writeq(val64, &bar0->tx_w_round_robin_2);1408 writeq(val64, &bar0->tx_w_round_robin_3);1409 writeq(val64, &bar0->tx_w_round_robin_4);1410 break;1411 case 2:1412 val64 = 0x0001000100010001ULL;1413 writeq(val64, &bar0->tx_w_round_robin_0);1414 writeq(val64, &bar0->tx_w_round_robin_1);1415 writeq(val64, &bar0->tx_w_round_robin_2);1416 writeq(val64, &bar0->tx_w_round_robin_3);1417 val64 = 0x0001000100000000ULL;1418 writeq(val64, &bar0->tx_w_round_robin_4);1419 break;1420 case 3:1421 val64 = 0x0001020001020001ULL;1422 writeq(val64, &bar0->tx_w_round_robin_0);1423 val64 = 0x0200010200010200ULL;1424 writeq(val64, &bar0->tx_w_round_robin_1);1425 val64 = 0x0102000102000102ULL;1426 writeq(val64, &bar0->tx_w_round_robin_2);1427 val64 = 0x0001020001020001ULL;1428 writeq(val64, &bar0->tx_w_round_robin_3);1429 val64 = 0x0200010200000000ULL;1430 writeq(val64, &bar0->tx_w_round_robin_4);1431 break;1432 case 4:1433 val64 = 0x0001020300010203ULL;1434 writeq(val64, &bar0->tx_w_round_robin_0);1435 writeq(val64, &bar0->tx_w_round_robin_1);1436 writeq(val64, &bar0->tx_w_round_robin_2);1437 writeq(val64, &bar0->tx_w_round_robin_3);1438 val64 = 0x0001020300000000ULL;1439 writeq(val64, &bar0->tx_w_round_robin_4);1440 break;1441 case 5:1442 val64 = 0x0001020304000102ULL;1443 writeq(val64, &bar0->tx_w_round_robin_0);1444 val64 = 0x0304000102030400ULL;1445 writeq(val64, &bar0->tx_w_round_robin_1);1446 val64 = 0x0102030400010203ULL;1447 writeq(val64, &bar0->tx_w_round_robin_2);1448 val64 = 0x0400010203040001ULL;1449 writeq(val64, &bar0->tx_w_round_robin_3);1450 val64 = 0x0203040000000000ULL;1451 writeq(val64, &bar0->tx_w_round_robin_4);1452 break;1453 case 6:1454 val64 = 0x0001020304050001ULL;1455 writeq(val64, &bar0->tx_w_round_robin_0);1456 val64 = 0x0203040500010203ULL;1457 writeq(val64, &bar0->tx_w_round_robin_1);1458 val64 = 0x0405000102030405ULL;1459 writeq(val64, &bar0->tx_w_round_robin_2);1460 val64 = 0x0001020304050001ULL;1461 writeq(val64, &bar0->tx_w_round_robin_3);1462 val64 = 0x0203040500000000ULL;1463 writeq(val64, &bar0->tx_w_round_robin_4);1464 break;1465 case 7:1466 val64 = 0x0001020304050600ULL;1467 writeq(val64, &bar0->tx_w_round_robin_0);1468 val64 = 0x0102030405060001ULL;1469 writeq(val64, &bar0->tx_w_round_robin_1);1470 val64 = 0x0203040506000102ULL;1471 writeq(val64, &bar0->tx_w_round_robin_2);1472 val64 = 0x0304050600010203ULL;1473 writeq(val64, &bar0->tx_w_round_robin_3);1474 val64 = 0x0405060000000000ULL;1475 writeq(val64, &bar0->tx_w_round_robin_4);1476 break;1477 case 8:1478 val64 = 0x0001020304050607ULL;1479 writeq(val64, &bar0->tx_w_round_robin_0);1480 writeq(val64, &bar0->tx_w_round_robin_1);1481 writeq(val64, &bar0->tx_w_round_robin_2);1482 writeq(val64, &bar0->tx_w_round_robin_3);1483 val64 = 0x0001020300000000ULL;1484 writeq(val64, &bar0->tx_w_round_robin_4);1485 break;1486 }1487 1488 /* Enable all configured Tx FIFO partitions */1489 val64 = readq(&bar0->tx_fifo_partition_0);1490 val64 |= (TX_FIFO_PARTITION_EN);1491 writeq(val64, &bar0->tx_fifo_partition_0);1492 1493 /* Filling the Rx round robin registers as per the1494 * number of Rings and steering based on QoS with1495 * equal priority.1496 */1497 switch (config->rx_ring_num) {1498 case 1:1499 val64 = 0x0;1500 writeq(val64, &bar0->rx_w_round_robin_0);1501 writeq(val64, &bar0->rx_w_round_robin_1);1502 writeq(val64, &bar0->rx_w_round_robin_2);1503 writeq(val64, &bar0->rx_w_round_robin_3);1504 writeq(val64, &bar0->rx_w_round_robin_4);1505 1506 val64 = 0x8080808080808080ULL;1507 writeq(val64, &bar0->rts_qos_steering);1508 break;1509 case 2:1510 val64 = 0x0001000100010001ULL;1511 writeq(val64, &bar0->rx_w_round_robin_0);1512 writeq(val64, &bar0->rx_w_round_robin_1);1513 writeq(val64, &bar0->rx_w_round_robin_2);1514 writeq(val64, &bar0->rx_w_round_robin_3);1515 val64 = 0x0001000100000000ULL;1516 writeq(val64, &bar0->rx_w_round_robin_4);1517 1518 val64 = 0x8080808040404040ULL;1519 writeq(val64, &bar0->rts_qos_steering);1520 break;1521 case 3:1522 val64 = 0x0001020001020001ULL;1523 writeq(val64, &bar0->rx_w_round_robin_0);1524 val64 = 0x0200010200010200ULL;1525 writeq(val64, &bar0->rx_w_round_robin_1);1526 val64 = 0x0102000102000102ULL;1527 writeq(val64, &bar0->rx_w_round_robin_2);1528 val64 = 0x0001020001020001ULL;1529 writeq(val64, &bar0->rx_w_round_robin_3);1530 val64 = 0x0200010200000000ULL;1531 writeq(val64, &bar0->rx_w_round_robin_4);1532 1533 val64 = 0x8080804040402020ULL;1534 writeq(val64, &bar0->rts_qos_steering);1535 break;1536 case 4:1537 val64 = 0x0001020300010203ULL;1538 writeq(val64, &bar0->rx_w_round_robin_0);1539 writeq(val64, &bar0->rx_w_round_robin_1);1540 writeq(val64, &bar0->rx_w_round_robin_2);1541 writeq(val64, &bar0->rx_w_round_robin_3);1542 val64 = 0x0001020300000000ULL;1543 writeq(val64, &bar0->rx_w_round_robin_4);1544 1545 val64 = 0x8080404020201010ULL;1546 writeq(val64, &bar0->rts_qos_steering);1547 break;1548 case 5:1549 val64 = 0x0001020304000102ULL;1550 writeq(val64, &bar0->rx_w_round_robin_0);1551 val64 = 0x0304000102030400ULL;1552 writeq(val64, &bar0->rx_w_round_robin_1);1553 val64 = 0x0102030400010203ULL;1554 writeq(val64, &bar0->rx_w_round_robin_2);1555 val64 = 0x0400010203040001ULL;1556 writeq(val64, &bar0->rx_w_round_robin_3);1557 val64 = 0x0203040000000000ULL;1558 writeq(val64, &bar0->rx_w_round_robin_4);1559 1560 val64 = 0x8080404020201008ULL;1561 writeq(val64, &bar0->rts_qos_steering);1562 break;1563 case 6:1564 val64 = 0x0001020304050001ULL;1565 writeq(val64, &bar0->rx_w_round_robin_0);1566 val64 = 0x0203040500010203ULL;1567 writeq(val64, &bar0->rx_w_round_robin_1);1568 val64 = 0x0405000102030405ULL;1569 writeq(val64, &bar0->rx_w_round_robin_2);1570 val64 = 0x0001020304050001ULL;1571 writeq(val64, &bar0->rx_w_round_robin_3);1572 val64 = 0x0203040500000000ULL;1573 writeq(val64, &bar0->rx_w_round_robin_4);1574 1575 val64 = 0x8080404020100804ULL;1576 writeq(val64, &bar0->rts_qos_steering);1577 break;1578 case 7:1579 val64 = 0x0001020304050600ULL;1580 writeq(val64, &bar0->rx_w_round_robin_0);1581 val64 = 0x0102030405060001ULL;1582 writeq(val64, &bar0->rx_w_round_robin_1);1583 val64 = 0x0203040506000102ULL;1584 writeq(val64, &bar0->rx_w_round_robin_2);1585 val64 = 0x0304050600010203ULL;1586 writeq(val64, &bar0->rx_w_round_robin_3);1587 val64 = 0x0405060000000000ULL;1588 writeq(val64, &bar0->rx_w_round_robin_4);1589 1590 val64 = 0x8080402010080402ULL;1591 writeq(val64, &bar0->rts_qos_steering);1592 break;1593 case 8:1594 val64 = 0x0001020304050607ULL;1595 writeq(val64, &bar0->rx_w_round_robin_0);1596 writeq(val64, &bar0->rx_w_round_robin_1);1597 writeq(val64, &bar0->rx_w_round_robin_2);1598 writeq(val64, &bar0->rx_w_round_robin_3);1599 val64 = 0x0001020300000000ULL;1600 writeq(val64, &bar0->rx_w_round_robin_4);1601 1602 val64 = 0x8040201008040201ULL;1603 writeq(val64, &bar0->rts_qos_steering);1604 break;1605 }1606 1607 /* UDP Fix */1608 val64 = 0;1609 for (i = 0; i < 8; i++)1610 writeq(val64, &bar0->rts_frm_len_n[i]);1611 1612 /* Set the default rts frame length for the rings configured */1613 val64 = MAC_RTS_FRM_LEN_SET(dev->mtu+22);1614 for (i = 0 ; i < config->rx_ring_num ; i++)1615 writeq(val64, &bar0->rts_frm_len_n[i]);1616 1617 /* Set the frame length for the configured rings1618 * desired by the user1619 */1620 for (i = 0; i < config->rx_ring_num; i++) {1621 /* If rts_frm_len[i] == 0 then it is assumed that user not1622 * specified frame length steering.1623 * If the user provides the frame length then program1624 * the rts_frm_len register for those values or else1625 * leave it as it is.1626 */1627 if (rts_frm_len[i] != 0) {1628 writeq(MAC_RTS_FRM_LEN_SET(rts_frm_len[i]),1629 &bar0->rts_frm_len_n[i]);1630 }1631 }1632 1633 /* Disable differentiated services steering logic */1634 for (i = 0; i < 64; i++) {1635 if (rts_ds_steer(nic, i, 0) == FAILURE) {1636 DBG_PRINT(ERR_DBG,1637 "%s: rts_ds_steer failed on codepoint %d\n",1638 dev->name, i);1639 return -ENODEV;1640 }1641 }1642 1643 /* Program statistics memory */1644 writeq(mac_control->stats_mem_phy, &bar0->stat_addr);1645 1646 if (nic->device_type == XFRAME_II_DEVICE) {1647 val64 = STAT_BC(0x320);1648 writeq(val64, &bar0->stat_byte_cnt);1649 }1650 1651 /*1652 * Initializing the sampling rate for the device to calculate the1653 * bandwidth utilization.1654 */1655 val64 = MAC_TX_LINK_UTIL_VAL(tmac_util_period) |1656 MAC_RX_LINK_UTIL_VAL(rmac_util_period);1657 writeq(val64, &bar0->mac_link_util);1658 1659 /*1660 * Initializing the Transmit and Receive Traffic Interrupt1661 * Scheme.1662 */1663 1664 /* Initialize TTI */1665 if (SUCCESS != init_tti(nic, nic->last_link_state, true))1666 return -ENODEV;1667 1668 /* RTI Initialization */1669 if (nic->device_type == XFRAME_II_DEVICE) {1670 /*1671 * Programmed to generate Apprx 500 Intrs per1672 * second1673 */1674 int count = (nic->config.bus_speed * 125)/4;1675 val64 = RTI_DATA1_MEM_RX_TIMER_VAL(count);1676 } else1677 val64 = RTI_DATA1_MEM_RX_TIMER_VAL(0xFFF);1678 val64 |= RTI_DATA1_MEM_RX_URNG_A(0xA) |1679 RTI_DATA1_MEM_RX_URNG_B(0x10) |1680 RTI_DATA1_MEM_RX_URNG_C(0x30) |1681 RTI_DATA1_MEM_RX_TIMER_AC_EN;1682 1683 writeq(val64, &bar0->rti_data1_mem);1684 1685 val64 = RTI_DATA2_MEM_RX_UFC_A(0x1) |1686 RTI_DATA2_MEM_RX_UFC_B(0x2) ;1687 if (nic->config.intr_type == MSI_X)1688 val64 |= (RTI_DATA2_MEM_RX_UFC_C(0x20) |1689 RTI_DATA2_MEM_RX_UFC_D(0x40));1690 else1691 val64 |= (RTI_DATA2_MEM_RX_UFC_C(0x40) |1692 RTI_DATA2_MEM_RX_UFC_D(0x80));1693 writeq(val64, &bar0->rti_data2_mem);1694 1695 for (i = 0; i < config->rx_ring_num; i++) {1696 val64 = RTI_CMD_MEM_WE |1697 RTI_CMD_MEM_STROBE_NEW_CMD |1698 RTI_CMD_MEM_OFFSET(i);1699 writeq(val64, &bar0->rti_command_mem);1700 1701 /*1702 * Once the operation completes, the Strobe bit of the1703 * command register will be reset. We poll for this1704 * particular condition. We wait for a maximum of 500ms1705 * for the operation to complete, if it's not complete1706 * by then we return error.1707 */1708 time = 0;1709 while (true) {1710 val64 = readq(&bar0->rti_command_mem);1711 if (!(val64 & RTI_CMD_MEM_STROBE_NEW_CMD))1712 break;1713 1714 if (time > 10) {1715 DBG_PRINT(ERR_DBG, "%s: RTI init failed\n",1716 dev->name);1717 return -ENODEV;1718 }1719 time++;1720 msleep(50);1721 }1722 }1723 1724 /*1725 * Initializing proper values as Pause threshold into all1726 * the 8 Queues on Rx side.1727 */1728 writeq(0xffbbffbbffbbffbbULL, &bar0->mc_pause_thresh_q0q3);1729 writeq(0xffbbffbbffbbffbbULL, &bar0->mc_pause_thresh_q4q7);1730 1731 /* Disable RMAC PAD STRIPPING */1732 add = &bar0->mac_cfg;1733 val64 = readq(&bar0->mac_cfg);1734 val64 &= ~(MAC_CFG_RMAC_STRIP_PAD);1735 writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key);1736 writel((u32) (val64), add);1737 writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key);1738 writel((u32) (val64 >> 32), (add + 4));1739 val64 = readq(&bar0->mac_cfg);1740 1741 /* Enable FCS stripping by adapter */1742 add = &bar0->mac_cfg;1743 val64 = readq(&bar0->mac_cfg);1744 val64 |= MAC_CFG_RMAC_STRIP_FCS;1745 if (nic->device_type == XFRAME_II_DEVICE)1746 writeq(val64, &bar0->mac_cfg);1747 else {1748 writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key);1749 writel((u32) (val64), add);1750 writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key);1751 writel((u32) (val64 >> 32), (add + 4));1752 }1753 1754 /*1755 * Set the time value to be inserted in the pause frame1756 * generated by xena.1757 */1758 val64 = readq(&bar0->rmac_pause_cfg);1759 val64 &= ~(RMAC_PAUSE_HG_PTIME(0xffff));1760 val64 |= RMAC_PAUSE_HG_PTIME(nic->mac_control.rmac_pause_time);1761 writeq(val64, &bar0->rmac_pause_cfg);1762 1763 /*1764 * Set the Threshold Limit for Generating the pause frame1765 * If the amount of data in any Queue exceeds ratio of1766 * (mac_control.mc_pause_threshold_q0q3 or q4q7)/2561767 * pause frame is generated1768 */1769 val64 = 0;1770 for (i = 0; i < 4; i++) {1771 val64 |= (((u64)0xFF00 |1772 nic->mac_control.mc_pause_threshold_q0q3)1773 << (i * 2 * 8));1774 }1775 writeq(val64, &bar0->mc_pause_thresh_q0q3);1776 1777 val64 = 0;1778 for (i = 0; i < 4; i++) {1779 val64 |= (((u64)0xFF00 |1780 nic->mac_control.mc_pause_threshold_q4q7)1781 << (i * 2 * 8));1782 }1783 writeq(val64, &bar0->mc_pause_thresh_q4q7);1784 1785 /*1786 * TxDMA will stop Read request if the number of read split has1787 * exceeded the limit pointed by shared_splits1788 */1789 val64 = readq(&bar0->pic_control);1790 val64 |= PIC_CNTL_SHARED_SPLITS(shared_splits);1791 writeq(val64, &bar0->pic_control);1792 1793 if (nic->config.bus_speed == 266) {1794 writeq(TXREQTO_VAL(0x7f) | TXREQTO_EN, &bar0->txreqtimeout);1795 writeq(0x0, &bar0->read_retry_delay);1796 writeq(0x0, &bar0->write_retry_delay);1797 }1798 1799 /*1800 * Programming the Herc to split every write transaction1801 * that does not start on an ADB to reduce disconnects.1802 */1803 if (nic->device_type == XFRAME_II_DEVICE) {1804 val64 = FAULT_BEHAVIOUR | EXT_REQ_EN |1805 MISC_LINK_STABILITY_PRD(3);1806 writeq(val64, &bar0->misc_control);1807 val64 = readq(&bar0->pic_control2);1808 val64 &= ~(s2BIT(13)|s2BIT(14)|s2BIT(15));1809 writeq(val64, &bar0->pic_control2);1810 }1811 if (strstr(nic->product_name, "CX4")) {1812 val64 = TMAC_AVG_IPG(0x17);1813 writeq(val64, &bar0->tmac_avg_ipg);1814 }1815 1816 return SUCCESS;1817}1818#define LINK_UP_DOWN_INTERRUPT 11819#define MAC_RMAC_ERR_TIMER 21820 1821static int s2io_link_fault_indication(struct s2io_nic *nic)1822{1823 if (nic->device_type == XFRAME_II_DEVICE)1824 return LINK_UP_DOWN_INTERRUPT;1825 else1826 return MAC_RMAC_ERR_TIMER;1827}1828 1829/**1830 * do_s2io_write_bits - update alarm bits in alarm register1831 * @value: alarm bits1832 * @flag: interrupt status1833 * @addr: address value1834 * Description: update alarm bits in alarm register1835 * Return Value:1836 * NONE.1837 */1838static void do_s2io_write_bits(u64 value, int flag, void __iomem *addr)1839{1840 u64 temp64;1841 1842 temp64 = readq(addr);1843 1844 if (flag == ENABLE_INTRS)1845 temp64 &= ~((u64)value);1846 else1847 temp64 |= ((u64)value);1848 writeq(temp64, addr);1849}1850 1851static void en_dis_err_alarms(struct s2io_nic *nic, u16 mask, int flag)1852{1853 struct XENA_dev_config __iomem *bar0 = nic->bar0;1854 register u64 gen_int_mask = 0;1855 u64 interruptible;1856 1857 writeq(DISABLE_ALL_INTRS, &bar0->general_int_mask);1858 if (mask & TX_DMA_INTR) {1859 gen_int_mask |= TXDMA_INT_M;1860 1861 do_s2io_write_bits(TXDMA_TDA_INT | TXDMA_PFC_INT |1862 TXDMA_PCC_INT | TXDMA_TTI_INT |1863 TXDMA_LSO_INT | TXDMA_TPA_INT |1864 TXDMA_SM_INT, flag, &bar0->txdma_int_mask);1865 1866 do_s2io_write_bits(PFC_ECC_DB_ERR | PFC_SM_ERR_ALARM |1867 PFC_MISC_0_ERR | PFC_MISC_1_ERR |1868 PFC_PCIX_ERR | PFC_ECC_SG_ERR, flag,1869 &bar0->pfc_err_mask);1870 1871 do_s2io_write_bits(TDA_Fn_ECC_DB_ERR | TDA_SM0_ERR_ALARM |1872 TDA_SM1_ERR_ALARM | TDA_Fn_ECC_SG_ERR |1873 TDA_PCIX_ERR, flag, &bar0->tda_err_mask);1874 1875 do_s2io_write_bits(PCC_FB_ECC_DB_ERR | PCC_TXB_ECC_DB_ERR |1876 PCC_SM_ERR_ALARM | PCC_WR_ERR_ALARM |1877 PCC_N_SERR | PCC_6_COF_OV_ERR |1878 PCC_7_COF_OV_ERR | PCC_6_LSO_OV_ERR |1879 PCC_7_LSO_OV_ERR | PCC_FB_ECC_SG_ERR |1880 PCC_TXB_ECC_SG_ERR,1881 flag, &bar0->pcc_err_mask);1882 1883 do_s2io_write_bits(TTI_SM_ERR_ALARM | TTI_ECC_SG_ERR |1884 TTI_ECC_DB_ERR, flag, &bar0->tti_err_mask);1885 1886 do_s2io_write_bits(LSO6_ABORT | LSO7_ABORT |1887 LSO6_SM_ERR_ALARM | LSO7_SM_ERR_ALARM |1888 LSO6_SEND_OFLOW | LSO7_SEND_OFLOW,1889 flag, &bar0->lso_err_mask);1890 1891 do_s2io_write_bits(TPA_SM_ERR_ALARM | TPA_TX_FRM_DROP,1892 flag, &bar0->tpa_err_mask);1893 1894 do_s2io_write_bits(SM_SM_ERR_ALARM, flag, &bar0->sm_err_mask);1895 }1896 1897 if (mask & TX_MAC_INTR) {1898 gen_int_mask |= TXMAC_INT_M;1899 do_s2io_write_bits(MAC_INT_STATUS_TMAC_INT, flag,1900 &bar0->mac_int_mask);1901 do_s2io_write_bits(TMAC_TX_BUF_OVRN | TMAC_TX_SM_ERR |1902 TMAC_ECC_SG_ERR | TMAC_ECC_DB_ERR |1903 TMAC_DESC_ECC_SG_ERR | TMAC_DESC_ECC_DB_ERR,1904 flag, &bar0->mac_tmac_err_mask);1905 }1906 1907 if (mask & TX_XGXS_INTR) {1908 gen_int_mask |= TXXGXS_INT_M;1909 do_s2io_write_bits(XGXS_INT_STATUS_TXGXS, flag,1910 &bar0->xgxs_int_mask);1911 do_s2io_write_bits(TXGXS_ESTORE_UFLOW | TXGXS_TX_SM_ERR |1912 TXGXS_ECC_SG_ERR | TXGXS_ECC_DB_ERR,1913 flag, &bar0->xgxs_txgxs_err_mask);1914 }1915 1916 if (mask & RX_DMA_INTR) {1917 gen_int_mask |= RXDMA_INT_M;1918 do_s2io_write_bits(RXDMA_INT_RC_INT_M | RXDMA_INT_RPA_INT_M |1919 RXDMA_INT_RDA_INT_M | RXDMA_INT_RTI_INT_M,1920 flag, &bar0->rxdma_int_mask);1921 do_s2io_write_bits(RC_PRCn_ECC_DB_ERR | RC_FTC_ECC_DB_ERR |1922 RC_PRCn_SM_ERR_ALARM | RC_FTC_SM_ERR_ALARM |1923 RC_PRCn_ECC_SG_ERR | RC_FTC_ECC_SG_ERR |1924 RC_RDA_FAIL_WR_Rn, flag, &bar0->rc_err_mask);1925 do_s2io_write_bits(PRC_PCI_AB_RD_Rn | PRC_PCI_AB_WR_Rn |1926 PRC_PCI_AB_F_WR_Rn | PRC_PCI_DP_RD_Rn |1927 PRC_PCI_DP_WR_Rn | PRC_PCI_DP_F_WR_Rn, flag,1928 &bar0->prc_pcix_err_mask);1929 do_s2io_write_bits(RPA_SM_ERR_ALARM | RPA_CREDIT_ERR |1930 RPA_ECC_SG_ERR | RPA_ECC_DB_ERR, flag,1931 &bar0->rpa_err_mask);1932 do_s2io_write_bits(RDA_RXDn_ECC_DB_ERR | RDA_FRM_ECC_DB_N_AERR |1933 RDA_SM1_ERR_ALARM | RDA_SM0_ERR_ALARM |1934 RDA_RXD_ECC_DB_SERR | RDA_RXDn_ECC_SG_ERR |1935 RDA_FRM_ECC_SG_ERR |1936 RDA_MISC_ERR|RDA_PCIX_ERR,1937 flag, &bar0->rda_err_mask);1938 do_s2io_write_bits(RTI_SM_ERR_ALARM |1939 RTI_ECC_SG_ERR | RTI_ECC_DB_ERR,1940 flag, &bar0->rti_err_mask);1941 }1942 1943 if (mask & RX_MAC_INTR) {1944 gen_int_mask |= RXMAC_INT_M;1945 do_s2io_write_bits(MAC_INT_STATUS_RMAC_INT, flag,1946 &bar0->mac_int_mask);1947 interruptible = (RMAC_RX_BUFF_OVRN | RMAC_RX_SM_ERR |1948 RMAC_UNUSED_INT | RMAC_SINGLE_ECC_ERR |1949 RMAC_DOUBLE_ECC_ERR);1950 if (s2io_link_fault_indication(nic) == MAC_RMAC_ERR_TIMER)1951 interruptible |= RMAC_LINK_STATE_CHANGE_INT;1952 do_s2io_write_bits(interruptible,1953 flag, &bar0->mac_rmac_err_mask);1954 }1955 1956 if (mask & RX_XGXS_INTR) {1957 gen_int_mask |= RXXGXS_INT_M;1958 do_s2io_write_bits(XGXS_INT_STATUS_RXGXS, flag,1959 &bar0->xgxs_int_mask);1960 do_s2io_write_bits(RXGXS_ESTORE_OFLOW | RXGXS_RX_SM_ERR, flag,1961 &bar0->xgxs_rxgxs_err_mask);1962 }1963 1964 if (mask & MC_INTR) {1965 gen_int_mask |= MC_INT_M;1966 do_s2io_write_bits(MC_INT_MASK_MC_INT,1967 flag, &bar0->mc_int_mask);1968 do_s2io_write_bits(MC_ERR_REG_SM_ERR | MC_ERR_REG_ECC_ALL_SNG |1969 MC_ERR_REG_ECC_ALL_DBL | PLL_LOCK_N, flag,1970 &bar0->mc_err_mask);1971 }1972 nic->general_int_mask = gen_int_mask;1973 1974 /* Remove this line when alarm interrupts are enabled */1975 nic->general_int_mask = 0;1976}1977 1978/**1979 * en_dis_able_nic_intrs - Enable or Disable the interrupts1980 * @nic: device private variable,1981 * @mask: A mask indicating which Intr block must be modified and,1982 * @flag: A flag indicating whether to enable or disable the Intrs.1983 * Description: This function will either disable or enable the interrupts1984 * depending on the flag argument. The mask argument can be used to1985 * enable/disable any Intr block.1986 * Return Value: NONE.1987 */1988 1989static void en_dis_able_nic_intrs(struct s2io_nic *nic, u16 mask, int flag)1990{1991 struct XENA_dev_config __iomem *bar0 = nic->bar0;1992 register u64 temp64 = 0, intr_mask = 0;1993 1994 intr_mask = nic->general_int_mask;1995 1996 /* Top level interrupt classification */1997 /* PIC Interrupts */1998 if (mask & TX_PIC_INTR) {1999 /* Enable PIC Intrs in the general intr mask register */2000 intr_mask |= TXPIC_INT_M;2001 if (flag == ENABLE_INTRS) {2002 /*2003 * If Hercules adapter enable GPIO otherwise2004 * disable all PCIX, Flash, MDIO, IIC and GPIO2005 * interrupts for now.2006 * TODO2007 */2008 if (s2io_link_fault_indication(nic) ==2009 LINK_UP_DOWN_INTERRUPT) {2010 do_s2io_write_bits(PIC_INT_GPIO, flag,2011 &bar0->pic_int_mask);2012 do_s2io_write_bits(GPIO_INT_MASK_LINK_UP, flag,2013 &bar0->gpio_int_mask);2014 } else2015 writeq(DISABLE_ALL_INTRS, &bar0->pic_int_mask);2016 } else if (flag == DISABLE_INTRS) {2017 /*2018 * Disable PIC Intrs in the general2019 * intr mask register2020 */2021 writeq(DISABLE_ALL_INTRS, &bar0->pic_int_mask);2022 }2023 }2024 2025 /* Tx traffic interrupts */2026 if (mask & TX_TRAFFIC_INTR) {2027 intr_mask |= TXTRAFFIC_INT_M;2028 if (flag == ENABLE_INTRS) {2029 /*2030 * Enable all the Tx side interrupts2031 * writing 0 Enables all 64 TX interrupt levels2032 */2033 writeq(0x0, &bar0->tx_traffic_mask);2034 } else if (flag == DISABLE_INTRS) {2035 /*2036 * Disable Tx Traffic Intrs in the general intr mask2037 * register.2038 */2039 writeq(DISABLE_ALL_INTRS, &bar0->tx_traffic_mask);2040 }2041 }2042 2043 /* Rx traffic interrupts */2044 if (mask & RX_TRAFFIC_INTR) {2045 intr_mask |= RXTRAFFIC_INT_M;2046 if (flag == ENABLE_INTRS) {2047 /* writing 0 Enables all 8 RX interrupt levels */2048 writeq(0x0, &bar0->rx_traffic_mask);2049 } else if (flag == DISABLE_INTRS) {2050 /*2051 * Disable Rx Traffic Intrs in the general intr mask2052 * register.2053 */2054 writeq(DISABLE_ALL_INTRS, &bar0->rx_traffic_mask);2055 }2056 }2057 2058 temp64 = readq(&bar0->general_int_mask);2059 if (flag == ENABLE_INTRS)2060 temp64 &= ~((u64)intr_mask);2061 else2062 temp64 = DISABLE_ALL_INTRS;2063 writeq(temp64, &bar0->general_int_mask);2064 2065 nic->general_int_mask = readq(&bar0->general_int_mask);2066}2067 2068/**2069 * verify_pcc_quiescent- Checks for PCC quiescent state2070 * @sp : private member of the device structure, which is a pointer to the2071 * s2io_nic structure.2072 * @flag: boolean controlling function path2073 * Return: 1 If PCC is quiescence2074 * 0 If PCC is not quiescence2075 */2076static int verify_pcc_quiescent(struct s2io_nic *sp, int flag)2077{2078 int ret = 0, herc;2079 struct XENA_dev_config __iomem *bar0 = sp->bar0;2080 u64 val64 = readq(&bar0->adapter_status);2081 2082 herc = (sp->device_type == XFRAME_II_DEVICE);2083 2084 if (flag == false) {2085 if ((!herc && (sp->pdev->revision >= 4)) || herc) {2086 if (!(val64 & ADAPTER_STATUS_RMAC_PCC_IDLE))2087 ret = 1;2088 } else {2089 if (!(val64 & ADAPTER_STATUS_RMAC_PCC_FOUR_IDLE))2090 ret = 1;2091 }2092 } else {2093 if ((!herc && (sp->pdev->revision >= 4)) || herc) {2094 if (((val64 & ADAPTER_STATUS_RMAC_PCC_IDLE) ==2095 ADAPTER_STATUS_RMAC_PCC_IDLE))2096 ret = 1;2097 } else {2098 if (((val64 & ADAPTER_STATUS_RMAC_PCC_FOUR_IDLE) ==2099 ADAPTER_STATUS_RMAC_PCC_FOUR_IDLE))2100 ret = 1;2101 }2102 }2103 2104 return ret;2105}2106/**2107 * verify_xena_quiescence - Checks whether the H/W is ready2108 * @sp : private member of the device structure, which is a pointer to the2109 * s2io_nic structure.2110 * Description: Returns whether the H/W is ready to go or not. Depending2111 * on whether adapter enable bit was written or not the comparison2112 * differs and the calling function passes the input argument flag to2113 * indicate this.2114 * Return: 1 If xena is quiescence2115 * 0 If Xena is not quiescence2116 */2117 2118static int verify_xena_quiescence(struct s2io_nic *sp)2119{2120 int mode;2121 struct XENA_dev_config __iomem *bar0 = sp->bar0;2122 u64 val64 = readq(&bar0->adapter_status);2123 mode = s2io_verify_pci_mode(sp);2124 2125 if (!(val64 & ADAPTER_STATUS_TDMA_READY)) {2126 DBG_PRINT(ERR_DBG, "TDMA is not ready!\n");2127 return 0;2128 }2129 if (!(val64 & ADAPTER_STATUS_RDMA_READY)) {2130 DBG_PRINT(ERR_DBG, "RDMA is not ready!\n");2131 return 0;2132 }2133 if (!(val64 & ADAPTER_STATUS_PFC_READY)) {2134 DBG_PRINT(ERR_DBG, "PFC is not ready!\n");2135 return 0;2136 }2137 if (!(val64 & ADAPTER_STATUS_TMAC_BUF_EMPTY)) {2138 DBG_PRINT(ERR_DBG, "TMAC BUF is not empty!\n");2139 return 0;2140 }2141 if (!(val64 & ADAPTER_STATUS_PIC_QUIESCENT)) {2142 DBG_PRINT(ERR_DBG, "PIC is not QUIESCENT!\n");2143 return 0;2144 }2145 if (!(val64 & ADAPTER_STATUS_MC_DRAM_READY)) {2146 DBG_PRINT(ERR_DBG, "MC_DRAM is not ready!\n");2147 return 0;2148 }2149 if (!(val64 & ADAPTER_STATUS_MC_QUEUES_READY)) {2150 DBG_PRINT(ERR_DBG, "MC_QUEUES is not ready!\n");2151 return 0;2152 }2153 if (!(val64 & ADAPTER_STATUS_M_PLL_LOCK)) {2154 DBG_PRINT(ERR_DBG, "M_PLL is not locked!\n");2155 return 0;2156 }2157 2158 /*2159 * In PCI 33 mode, the P_PLL is not used, and therefore,2160 * the P_PLL_LOCK bit in the adapter_status register will2161 * not be asserted.2162 */2163 if (!(val64 & ADAPTER_STATUS_P_PLL_LOCK) &&2164 sp->device_type == XFRAME_II_DEVICE &&2165 mode != PCI_MODE_PCI_33) {2166 DBG_PRINT(ERR_DBG, "P_PLL is not locked!\n");2167 return 0;2168 }2169 if (!((val64 & ADAPTER_STATUS_RC_PRC_QUIESCENT) ==2170 ADAPTER_STATUS_RC_PRC_QUIESCENT)) {2171 DBG_PRINT(ERR_DBG, "RC_PRC is not QUIESCENT!\n");2172 return 0;2173 }2174 return 1;2175}2176 2177/**2178 * fix_mac_address - Fix for Mac addr problem on Alpha platforms2179 * @sp: Pointer to device specifc structure2180 * Description :2181 * New procedure to clear mac address reading problems on Alpha platforms2182 *2183 */2184 2185static void fix_mac_address(struct s2io_nic *sp)2186{2187 struct XENA_dev_config __iomem *bar0 = sp->bar0;2188 int i = 0;2189 2190 while (fix_mac[i] != END_SIGN) {2191 writeq(fix_mac[i++], &bar0->gpio_control);2192 udelay(10);2193 (void) readq(&bar0->gpio_control);2194 }2195}2196 2197/**2198 * start_nic - Turns the device on2199 * @nic : device private variable.2200 * Description:2201 * This function actually turns the device on. Before this function is2202 * called,all Registers are configured from their reset states2203 * and shared memory is allocated but the NIC is still quiescent. On2204 * calling this function, the device interrupts are cleared and the NIC is2205 * literally switched on by writing into the adapter control register.2206 * Return Value:2207 * SUCCESS on success and -1 on failure.2208 */2209 2210static int start_nic(struct s2io_nic *nic)2211{2212 struct XENA_dev_config __iomem *bar0 = nic->bar0;2213 struct net_device *dev = nic->dev;2214 register u64 val64 = 0;2215 u16 subid, i;2216 struct config_param *config = &nic->config;2217 struct mac_info *mac_control = &nic->mac_control;2218 2219 /* PRC Initialization and configuration */2220 for (i = 0; i < config->rx_ring_num; i++) {2221 struct ring_info *ring = &mac_control->rings[i];2222 2223 writeq((u64)ring->rx_blocks[0].block_dma_addr,2224 &bar0->prc_rxd0_n[i]);2225 2226 val64 = readq(&bar0->prc_ctrl_n[i]);2227 if (nic->rxd_mode == RXD_MODE_1)2228 val64 |= PRC_CTRL_RC_ENABLED;2229 else2230 val64 |= PRC_CTRL_RC_ENABLED | PRC_CTRL_RING_MODE_3;2231 if (nic->device_type == XFRAME_II_DEVICE)2232 val64 |= PRC_CTRL_GROUP_READS;2233 val64 &= ~PRC_CTRL_RXD_BACKOFF_INTERVAL(0xFFFFFF);2234 val64 |= PRC_CTRL_RXD_BACKOFF_INTERVAL(0x1000);2235 writeq(val64, &bar0->prc_ctrl_n[i]);2236 }2237 2238 if (nic->rxd_mode == RXD_MODE_3B) {2239 /* Enabling 2 buffer mode by writing into Rx_pa_cfg reg. */2240 val64 = readq(&bar0->rx_pa_cfg);2241 val64 |= RX_PA_CFG_IGNORE_L2_ERR;2242 writeq(val64, &bar0->rx_pa_cfg);2243 }2244 2245 if (vlan_tag_strip == 0) {2246 val64 = readq(&bar0->rx_pa_cfg);2247 val64 &= ~RX_PA_CFG_STRIP_VLAN_TAG;2248 writeq(val64, &bar0->rx_pa_cfg);2249 nic->vlan_strip_flag = 0;2250 }2251 2252 /*2253 * Enabling MC-RLDRAM. After enabling the device, we timeout2254 * for around 100ms, which is approximately the time required2255 * for the device to be ready for operation.2256 */2257 val64 = readq(&bar0->mc_rldram_mrs);2258 val64 |= MC_RLDRAM_QUEUE_SIZE_ENABLE | MC_RLDRAM_MRS_ENABLE;2259 SPECIAL_REG_WRITE(val64, &bar0->mc_rldram_mrs, UF);2260 val64 = readq(&bar0->mc_rldram_mrs);2261 2262 msleep(100); /* Delay by around 100 ms. */2263 2264 /* Enabling ECC Protection. */2265 val64 = readq(&bar0->adapter_control);2266 val64 &= ~ADAPTER_ECC_EN;2267 writeq(val64, &bar0->adapter_control);2268 2269 /*2270 * Verify if the device is ready to be enabled, if so enable2271 * it.2272 */2273 val64 = readq(&bar0->adapter_status);2274 if (!verify_xena_quiescence(nic)) {2275 DBG_PRINT(ERR_DBG, "%s: device is not ready, "2276 "Adapter status reads: 0x%llx\n",2277 dev->name, (unsigned long long)val64);2278 return FAILURE;2279 }2280 2281 /*2282 * With some switches, link might be already up at this point.2283 * Because of this weird behavior, when we enable laser,2284 * we may not get link. We need to handle this. We cannot2285 * figure out which switch is misbehaving. So we are forced to2286 * make a global change.2287 */2288 2289 /* Enabling Laser. */2290 val64 = readq(&bar0->adapter_control);2291 val64 |= ADAPTER_EOI_TX_ON;2292 writeq(val64, &bar0->adapter_control);2293 2294 if (s2io_link_fault_indication(nic) == MAC_RMAC_ERR_TIMER) {2295 /*2296 * Dont see link state interrupts initially on some switches,2297 * so directly scheduling the link state task here.2298 */2299 schedule_work(&nic->set_link_task);2300 }2301 /* SXE-002: Initialize link and activity LED */2302 subid = nic->pdev->subsystem_device;2303 if (((subid & 0xFF) >= 0x07) &&2304 (nic->device_type == XFRAME_I_DEVICE)) {2305 val64 = readq(&bar0->gpio_control);2306 val64 |= 0x0000800000000000ULL;2307 writeq(val64, &bar0->gpio_control);2308 val64 = 0x0411040400000000ULL;2309 writeq(val64, (void __iomem *)bar0 + 0x2700);2310 }2311 2312 return SUCCESS;2313}2314/**2315 * s2io_txdl_getskb - Get the skb from txdl, unmap and return skb2316 * @fifo_data: fifo data pointer2317 * @txdlp: descriptor2318 * @get_off: unused2319 */2320static struct sk_buff *s2io_txdl_getskb(struct fifo_info *fifo_data,2321 struct TxD *txdlp, int get_off)2322{2323 struct s2io_nic *nic = fifo_data->nic;2324 struct sk_buff *skb;2325 struct TxD *txds;2326 u16 j, frg_cnt;2327 2328 txds = txdlp;2329 if (txds->Host_Control == (u64)(long)fifo_data->ufo_in_band_v) {2330 dma_unmap_single(&nic->pdev->dev,2331 (dma_addr_t)txds->Buffer_Pointer,2332 sizeof(u64), DMA_TO_DEVICE);2333 txds++;2334 }2335 2336 skb = (struct sk_buff *)((unsigned long)txds->Host_Control);2337 if (!skb) {2338 memset(txdlp, 0, (sizeof(struct TxD) * fifo_data->max_txds));2339 return NULL;2340 }2341 dma_unmap_single(&nic->pdev->dev, (dma_addr_t)txds->Buffer_Pointer,2342 skb_headlen(skb), DMA_TO_DEVICE);2343 frg_cnt = skb_shinfo(skb)->nr_frags;2344 if (frg_cnt) {2345 txds++;2346 for (j = 0; j < frg_cnt; j++, txds++) {2347 const skb_frag_t *frag = &skb_shinfo(skb)->frags[j];2348 if (!txds->Buffer_Pointer)2349 break;2350 dma_unmap_page(&nic->pdev->dev,2351 (dma_addr_t)txds->Buffer_Pointer,2352 skb_frag_size(frag), DMA_TO_DEVICE);2353 }2354 }2355 memset(txdlp, 0, (sizeof(struct TxD) * fifo_data->max_txds));2356 return skb;2357}2358 2359/**2360 * free_tx_buffers - Free all queued Tx buffers2361 * @nic : device private variable.2362 * Description:2363 * Free all queued Tx buffers.2364 * Return Value: void2365 */2366 2367static void free_tx_buffers(struct s2io_nic *nic)2368{2369 struct net_device *dev = nic->dev;2370 struct sk_buff *skb;2371 struct TxD *txdp;2372 int i, j;2373 int cnt = 0;2374 struct config_param *config = &nic->config;2375 struct mac_info *mac_control = &nic->mac_control;2376 struct stat_block *stats = mac_control->stats_info;2377 struct swStat *swstats = &stats->sw_stat;2378 2379 for (i = 0; i < config->tx_fifo_num; i++) {2380 struct tx_fifo_config *tx_cfg = &config->tx_cfg[i];2381 struct fifo_info *fifo = &mac_control->fifos[i];2382 unsigned long flags;2383 2384 spin_lock_irqsave(&fifo->tx_lock, flags);2385 for (j = 0; j < tx_cfg->fifo_len; j++) {2386 txdp = fifo->list_info[j].list_virt_addr;2387 skb = s2io_txdl_getskb(&mac_control->fifos[i], txdp, j);2388 if (skb) {2389 swstats->mem_freed += skb->truesize;2390 dev_kfree_skb_irq(skb);2391 cnt++;2392 }2393 }2394 DBG_PRINT(INTR_DBG,2395 "%s: forcibly freeing %d skbs on FIFO%d\n",2396 dev->name, cnt, i);2397 fifo->tx_curr_get_info.offset = 0;2398 fifo->tx_curr_put_info.offset = 0;2399 spin_unlock_irqrestore(&fifo->tx_lock, flags);2400 }2401}2402 2403/**2404 * stop_nic - To stop the nic2405 * @nic : device private variable.2406 * Description:2407 * This function does exactly the opposite of what the start_nic()2408 * function does. This function is called to stop the device.2409 * Return Value:2410 * void.2411 */2412 2413static void stop_nic(struct s2io_nic *nic)2414{2415 struct XENA_dev_config __iomem *bar0 = nic->bar0;2416 register u64 val64 = 0;2417 u16 interruptible;2418 2419 /* Disable all interrupts */2420 en_dis_err_alarms(nic, ENA_ALL_INTRS, DISABLE_INTRS);2421 interruptible = TX_TRAFFIC_INTR | RX_TRAFFIC_INTR;2422 interruptible |= TX_PIC_INTR;2423 en_dis_able_nic_intrs(nic, interruptible, DISABLE_INTRS);2424 2425 /* Clearing Adapter_En bit of ADAPTER_CONTROL Register */2426 val64 = readq(&bar0->adapter_control);2427 val64 &= ~(ADAPTER_CNTL_EN);2428 writeq(val64, &bar0->adapter_control);2429}2430 2431/**2432 * fill_rx_buffers - Allocates the Rx side skbs2433 * @nic : device private variable.2434 * @ring: per ring structure2435 * @from_card_up: If this is true, we will map the buffer to get2436 * the dma address for buf0 and buf1 to give it to the card.2437 * Else we will sync the already mapped buffer to give it to the card.2438 * Description:2439 * The function allocates Rx side skbs and puts the physical2440 * address of these buffers into the RxD buffer pointers, so that the NIC2441 * can DMA the received frame into these locations.2442 * The NIC supports 3 receive modes, viz2443 * 1. single buffer,2444 * 2. three buffer and2445 * 3. Five buffer modes.2446 * Each mode defines how many fragments the received frame will be split2447 * up into by the NIC. The frame is split into L3 header, L4 Header,2448 * L4 payload in three buffer mode and in 5 buffer mode, L4 payload itself2449 * is split into 3 fragments. As of now only single buffer mode is2450 * supported.2451 * Return Value:2452 * SUCCESS on success or an appropriate -ve value on failure.2453 */2454static int fill_rx_buffers(struct s2io_nic *nic, struct ring_info *ring,2455 int from_card_up)2456{2457 struct sk_buff *skb;2458 struct RxD_t *rxdp;2459 int off, size, block_no, block_no1;2460 u32 alloc_tab = 0;2461 u32 alloc_cnt;2462 u64 tmp;2463 struct buffAdd *ba;2464 struct RxD_t *first_rxdp = NULL;2465 u64 Buffer0_ptr = 0, Buffer1_ptr = 0;2466 struct RxD1 *rxdp1;2467 struct RxD3 *rxdp3;2468 struct swStat *swstats = &ring->nic->mac_control.stats_info->sw_stat;2469 2470 alloc_cnt = ring->pkt_cnt - ring->rx_bufs_left;2471 2472 block_no1 = ring->rx_curr_get_info.block_index;2473 while (alloc_tab < alloc_cnt) {2474 block_no = ring->rx_curr_put_info.block_index;2475 2476 off = ring->rx_curr_put_info.offset;2477 2478 rxdp = ring->rx_blocks[block_no].rxds[off].virt_addr;2479 2480 if ((block_no == block_no1) &&2481 (off == ring->rx_curr_get_info.offset) &&2482 (rxdp->Host_Control)) {2483 DBG_PRINT(INTR_DBG, "%s: Get and Put info equated\n",2484 ring->dev->name);2485 goto end;2486 }2487 if (off && (off == ring->rxd_count)) {2488 ring->rx_curr_put_info.block_index++;2489 if (ring->rx_curr_put_info.block_index ==2490 ring->block_count)2491 ring->rx_curr_put_info.block_index = 0;2492 block_no = ring->rx_curr_put_info.block_index;2493 off = 0;2494 ring->rx_curr_put_info.offset = off;2495 rxdp = ring->rx_blocks[block_no].block_virt_addr;2496 DBG_PRINT(INTR_DBG, "%s: Next block at: %p\n",2497 ring->dev->name, rxdp);2498 2499 }2500 2501 if ((rxdp->Control_1 & RXD_OWN_XENA) &&2502 ((ring->rxd_mode == RXD_MODE_3B) &&2503 (rxdp->Control_2 & s2BIT(0)))) {2504 ring->rx_curr_put_info.offset = off;2505 goto end;2506 }2507 /* calculate size of skb based on ring mode */2508 size = ring->mtu +2509 HEADER_ETHERNET_II_802_3_SIZE +2510 HEADER_802_2_SIZE + HEADER_SNAP_SIZE;2511 if (ring->rxd_mode == RXD_MODE_1)2512 size += NET_IP_ALIGN;2513 else2514 size = ring->mtu + ALIGN_SIZE + BUF0_LEN + 4;2515 2516 /* allocate skb */2517 skb = netdev_alloc_skb(nic->dev, size);2518 if (!skb) {2519 DBG_PRINT(INFO_DBG, "%s: Could not allocate skb\n",2520 ring->dev->name);2521 if (first_rxdp) {2522 dma_wmb();2523 first_rxdp->Control_1 |= RXD_OWN_XENA;2524 }2525 swstats->mem_alloc_fail_cnt++;2526 2527 return -ENOMEM ;2528 }2529 swstats->mem_allocated += skb->truesize;2530 2531 if (ring->rxd_mode == RXD_MODE_1) {2532 /* 1 buffer mode - normal operation mode */2533 rxdp1 = (struct RxD1 *)rxdp;2534 memset(rxdp, 0, sizeof(struct RxD1));2535 skb_reserve(skb, NET_IP_ALIGN);2536 rxdp1->Buffer0_ptr =2537 dma_map_single(&ring->pdev->dev, skb->data,2538 size - NET_IP_ALIGN,2539 DMA_FROM_DEVICE);2540 if (dma_mapping_error(&nic->pdev->dev, rxdp1->Buffer0_ptr))2541 goto pci_map_failed;2542 2543 rxdp->Control_2 =2544 SET_BUFFER0_SIZE_1(size - NET_IP_ALIGN);2545 rxdp->Host_Control = (unsigned long)skb;2546 } else if (ring->rxd_mode == RXD_MODE_3B) {2547 /*2548 * 2 buffer mode -2549 * 2 buffer mode provides 1282550 * byte aligned receive buffers.2551 */2552 2553 rxdp3 = (struct RxD3 *)rxdp;2554 /* save buffer pointers to avoid frequent dma mapping */2555 Buffer0_ptr = rxdp3->Buffer0_ptr;2556 Buffer1_ptr = rxdp3->Buffer1_ptr;2557 memset(rxdp, 0, sizeof(struct RxD3));2558 /* restore the buffer pointers for dma sync*/2559 rxdp3->Buffer0_ptr = Buffer0_ptr;2560 rxdp3->Buffer1_ptr = Buffer1_ptr;2561 2562 ba = &ring->ba[block_no][off];2563 skb_reserve(skb, BUF0_LEN);2564 tmp = (u64)(unsigned long)skb->data;2565 tmp += ALIGN_SIZE;2566 tmp &= ~ALIGN_SIZE;2567 skb->data = (void *) (unsigned long)tmp;2568 skb_reset_tail_pointer(skb);2569 2570 if (from_card_up) {2571 rxdp3->Buffer0_ptr =2572 dma_map_single(&ring->pdev->dev,2573 ba->ba_0, BUF0_LEN,2574 DMA_FROM_DEVICE);2575 if (dma_mapping_error(&nic->pdev->dev, rxdp3->Buffer0_ptr))2576 goto pci_map_failed;2577 } else2578 dma_sync_single_for_device(&ring->pdev->dev,2579 (dma_addr_t)rxdp3->Buffer0_ptr,2580 BUF0_LEN,2581 DMA_FROM_DEVICE);2582 2583 rxdp->Control_2 = SET_BUFFER0_SIZE_3(BUF0_LEN);2584 if (ring->rxd_mode == RXD_MODE_3B) {2585 /* Two buffer mode */2586 2587 /*2588 * Buffer2 will have L3/L4 header plus2589 * L4 payload2590 */2591 rxdp3->Buffer2_ptr = dma_map_single(&ring->pdev->dev,2592 skb->data,2593 ring->mtu + 4,2594 DMA_FROM_DEVICE);2595 2596 if (dma_mapping_error(&nic->pdev->dev, rxdp3->Buffer2_ptr))2597 goto pci_map_failed;2598 2599 if (from_card_up) {2600 rxdp3->Buffer1_ptr =2601 dma_map_single(&ring->pdev->dev,2602 ba->ba_1,2603 BUF1_LEN,2604 DMA_FROM_DEVICE);2605 2606 if (dma_mapping_error(&nic->pdev->dev,2607 rxdp3->Buffer1_ptr)) {2608 dma_unmap_single(&ring->pdev->dev,2609 (dma_addr_t)(unsigned long)2610 skb->data,2611 ring->mtu + 4,2612 DMA_FROM_DEVICE);2613 goto pci_map_failed;2614 }2615 }2616 rxdp->Control_2 |= SET_BUFFER1_SIZE_3(1);2617 rxdp->Control_2 |= SET_BUFFER2_SIZE_32618 (ring->mtu + 4);2619 }2620 rxdp->Control_2 |= s2BIT(0);2621 rxdp->Host_Control = (unsigned long) (skb);2622 }2623 if (alloc_tab & ((1 << rxsync_frequency) - 1))2624 rxdp->Control_1 |= RXD_OWN_XENA;2625 off++;2626 if (off == (ring->rxd_count + 1))2627 off = 0;2628 ring->rx_curr_put_info.offset = off;2629 2630 rxdp->Control_2 |= SET_RXD_MARKER;2631 if (!(alloc_tab & ((1 << rxsync_frequency) - 1))) {2632 if (first_rxdp) {2633 dma_wmb();2634 first_rxdp->Control_1 |= RXD_OWN_XENA;2635 }2636 first_rxdp = rxdp;2637 }2638 ring->rx_bufs_left += 1;2639 alloc_tab++;2640 }2641 2642end:2643 /* Transfer ownership of first descriptor to adapter just before2644 * exiting. Before that, use memory barrier so that ownership2645 * and other fields are seen by adapter correctly.2646 */2647 if (first_rxdp) {2648 dma_wmb();2649 first_rxdp->Control_1 |= RXD_OWN_XENA;2650 }2651 2652 return SUCCESS;2653 2654pci_map_failed:2655 swstats->pci_map_fail_cnt++;2656 swstats->mem_freed += skb->truesize;2657 dev_kfree_skb_irq(skb);2658 return -ENOMEM;2659}2660 2661static void free_rxd_blk(struct s2io_nic *sp, int ring_no, int blk)2662{2663 struct net_device *dev = sp->dev;2664 int j;2665 struct sk_buff *skb;2666 struct RxD_t *rxdp;2667 struct RxD1 *rxdp1;2668 struct RxD3 *rxdp3;2669 struct mac_info *mac_control = &sp->mac_control;2670 struct stat_block *stats = mac_control->stats_info;2671 struct swStat *swstats = &stats->sw_stat;2672 2673 for (j = 0 ; j < rxd_count[sp->rxd_mode]; j++) {2674 rxdp = mac_control->rings[ring_no].2675 rx_blocks[blk].rxds[j].virt_addr;2676 skb = (struct sk_buff *)((unsigned long)rxdp->Host_Control);2677 if (!skb)2678 continue;2679 if (sp->rxd_mode == RXD_MODE_1) {2680 rxdp1 = (struct RxD1 *)rxdp;2681 dma_unmap_single(&sp->pdev->dev,2682 (dma_addr_t)rxdp1->Buffer0_ptr,2683 dev->mtu +2684 HEADER_ETHERNET_II_802_3_SIZE +2685 HEADER_802_2_SIZE + HEADER_SNAP_SIZE,2686 DMA_FROM_DEVICE);2687 memset(rxdp, 0, sizeof(struct RxD1));2688 } else if (sp->rxd_mode == RXD_MODE_3B) {2689 rxdp3 = (struct RxD3 *)rxdp;2690 dma_unmap_single(&sp->pdev->dev,2691 (dma_addr_t)rxdp3->Buffer0_ptr,2692 BUF0_LEN, DMA_FROM_DEVICE);2693 dma_unmap_single(&sp->pdev->dev,2694 (dma_addr_t)rxdp3->Buffer1_ptr,2695 BUF1_LEN, DMA_FROM_DEVICE);2696 dma_unmap_single(&sp->pdev->dev,2697 (dma_addr_t)rxdp3->Buffer2_ptr,2698 dev->mtu + 4, DMA_FROM_DEVICE);2699 memset(rxdp, 0, sizeof(struct RxD3));2700 }2701 swstats->mem_freed += skb->truesize;2702 dev_kfree_skb(skb);2703 mac_control->rings[ring_no].rx_bufs_left -= 1;2704 }2705}2706 2707/**2708 * free_rx_buffers - Frees all Rx buffers2709 * @sp: device private variable.2710 * Description:2711 * This function will free all Rx buffers allocated by host.2712 * Return Value:2713 * NONE.2714 */2715 2716static void free_rx_buffers(struct s2io_nic *sp)2717{2718 struct net_device *dev = sp->dev;2719 int i, blk = 0, buf_cnt = 0;2720 struct config_param *config = &sp->config;2721 struct mac_info *mac_control = &sp->mac_control;2722 2723 for (i = 0; i < config->rx_ring_num; i++) {2724 struct ring_info *ring = &mac_control->rings[i];2725 2726 for (blk = 0; blk < rx_ring_sz[i]; blk++)2727 free_rxd_blk(sp, i, blk);2728 2729 ring->rx_curr_put_info.block_index = 0;2730 ring->rx_curr_get_info.block_index = 0;2731 ring->rx_curr_put_info.offset = 0;2732 ring->rx_curr_get_info.offset = 0;2733 ring->rx_bufs_left = 0;2734 DBG_PRINT(INIT_DBG, "%s: Freed 0x%x Rx Buffers on ring%d\n",2735 dev->name, buf_cnt, i);2736 }2737}2738 2739static int s2io_chk_rx_buffers(struct s2io_nic *nic, struct ring_info *ring)2740{2741 if (fill_rx_buffers(nic, ring, 0) == -ENOMEM) {2742 DBG_PRINT(INFO_DBG, "%s: Out of memory in Rx Intr!!\n",2743 ring->dev->name);2744 }2745 return 0;2746}2747 2748/**2749 * s2io_poll_msix - Rx interrupt handler for NAPI support2750 * @napi : pointer to the napi structure.2751 * @budget : The number of packets that were budgeted to be processed2752 * during one pass through the 'Poll" function.2753 * Description:2754 * Comes into picture only if NAPI support has been incorporated. It does2755 * the same thing that rx_intr_handler does, but not in a interrupt context2756 * also It will process only a given number of packets.2757 * Return value:2758 * 0 on success and 1 if there are No Rx packets to be processed.2759 */2760 2761static int s2io_poll_msix(struct napi_struct *napi, int budget)2762{2763 struct ring_info *ring = container_of(napi, struct ring_info, napi);2764 struct net_device *dev = ring->dev;2765 int pkts_processed = 0;2766 u8 __iomem *addr = NULL;2767 u8 val8 = 0;2768 struct s2io_nic *nic = netdev_priv(dev);2769 struct XENA_dev_config __iomem *bar0 = nic->bar0;2770 int budget_org = budget;2771 2772 if (unlikely(!is_s2io_card_up(nic)))2773 return 0;2774 2775 pkts_processed = rx_intr_handler(ring, budget);2776 s2io_chk_rx_buffers(nic, ring);2777 2778 if (pkts_processed < budget_org) {2779 napi_complete_done(napi, pkts_processed);2780 /*Re Enable MSI-Rx Vector*/2781 addr = (u8 __iomem *)&bar0->xmsi_mask_reg;2782 addr += 7 - ring->ring_no;2783 val8 = (ring->ring_no == 0) ? 0x3f : 0xbf;2784 writeb(val8, addr);2785 val8 = readb(addr);2786 }2787 return pkts_processed;2788}2789 2790static int s2io_poll_inta(struct napi_struct *napi, int budget)2791{2792 struct s2io_nic *nic = container_of(napi, struct s2io_nic, napi);2793 int pkts_processed = 0;2794 int ring_pkts_processed, i;2795 struct XENA_dev_config __iomem *bar0 = nic->bar0;2796 int budget_org = budget;2797 struct config_param *config = &nic->config;2798 struct mac_info *mac_control = &nic->mac_control;2799 2800 if (unlikely(!is_s2io_card_up(nic)))2801 return 0;2802 2803 for (i = 0; i < config->rx_ring_num; i++) {2804 struct ring_info *ring = &mac_control->rings[i];2805 ring_pkts_processed = rx_intr_handler(ring, budget);2806 s2io_chk_rx_buffers(nic, ring);2807 pkts_processed += ring_pkts_processed;2808 budget -= ring_pkts_processed;2809 if (budget <= 0)2810 break;2811 }2812 if (pkts_processed < budget_org) {2813 napi_complete_done(napi, pkts_processed);2814 /* Re enable the Rx interrupts for the ring */2815 writeq(0, &bar0->rx_traffic_mask);2816 readl(&bar0->rx_traffic_mask);2817 }2818 return pkts_processed;2819}2820 2821#ifdef CONFIG_NET_POLL_CONTROLLER2822/**2823 * s2io_netpoll - netpoll event handler entry point2824 * @dev : pointer to the device structure.2825 * Description:2826 * This function will be called by upper layer to check for events on the2827 * interface in situations where interrupts are disabled. It is used for2828 * specific in-kernel networking tasks, such as remote consoles and kernel2829 * debugging over the network (example netdump in RedHat).2830 */2831static void s2io_netpoll(struct net_device *dev)2832{2833 struct s2io_nic *nic = netdev_priv(dev);2834 const int irq = nic->pdev->irq;2835 struct XENA_dev_config __iomem *bar0 = nic->bar0;2836 u64 val64 = 0xFFFFFFFFFFFFFFFFULL;2837 int i;2838 struct config_param *config = &nic->config;2839 struct mac_info *mac_control = &nic->mac_control;2840 2841 if (pci_channel_offline(nic->pdev))2842 return;2843 2844 disable_irq(irq);2845 2846 writeq(val64, &bar0->rx_traffic_int);2847 writeq(val64, &bar0->tx_traffic_int);2848 2849 /* we need to free up the transmitted skbufs or else netpoll will2850 * run out of skbs and will fail and eventually netpoll application such2851 * as netdump will fail.2852 */2853 for (i = 0; i < config->tx_fifo_num; i++)2854 tx_intr_handler(&mac_control->fifos[i]);2855 2856 /* check for received packet and indicate up to network */2857 for (i = 0; i < config->rx_ring_num; i++) {2858 struct ring_info *ring = &mac_control->rings[i];2859 2860 rx_intr_handler(ring, 0);2861 }2862 2863 for (i = 0; i < config->rx_ring_num; i++) {2864 struct ring_info *ring = &mac_control->rings[i];2865 2866 if (fill_rx_buffers(nic, ring, 0) == -ENOMEM) {2867 DBG_PRINT(INFO_DBG,2868 "%s: Out of memory in Rx Netpoll!!\n",2869 dev->name);2870 break;2871 }2872 }2873 enable_irq(irq);2874}2875#endif2876 2877/**2878 * rx_intr_handler - Rx interrupt handler2879 * @ring_data: per ring structure.2880 * @budget: budget for napi processing.2881 * Description:2882 * If the interrupt is because of a received frame or if the2883 * receive ring contains fresh as yet un-processed frames,this function is2884 * called. It picks out the RxD at which place the last Rx processing had2885 * stopped and sends the skb to the OSM's Rx handler and then increments2886 * the offset.2887 * Return Value:2888 * No. of napi packets processed.2889 */2890static int rx_intr_handler(struct ring_info *ring_data, int budget)2891{2892 int get_block, put_block;2893 struct rx_curr_get_info get_info, put_info;2894 struct RxD_t *rxdp;2895 struct sk_buff *skb;2896 int pkt_cnt = 0, napi_pkts = 0;2897 int i;2898 struct RxD1 *rxdp1;2899 struct RxD3 *rxdp3;2900 2901 if (budget <= 0)2902 return napi_pkts;2903 2904 get_info = ring_data->rx_curr_get_info;2905 get_block = get_info.block_index;2906 memcpy(&put_info, &ring_data->rx_curr_put_info, sizeof(put_info));2907 put_block = put_info.block_index;2908 rxdp = ring_data->rx_blocks[get_block].rxds[get_info.offset].virt_addr;2909 2910 while (RXD_IS_UP2DT(rxdp)) {2911 /*2912 * If your are next to put index then it's2913 * FIFO full condition2914 */2915 if ((get_block == put_block) &&2916 (get_info.offset + 1) == put_info.offset) {2917 DBG_PRINT(INTR_DBG, "%s: Ring Full\n",2918 ring_data->dev->name);2919 break;2920 }2921 skb = (struct sk_buff *)((unsigned long)rxdp->Host_Control);2922 if (skb == NULL) {2923 DBG_PRINT(ERR_DBG, "%s: NULL skb in Rx Intr\n",2924 ring_data->dev->name);2925 return 0;2926 }2927 if (ring_data->rxd_mode == RXD_MODE_1) {2928 rxdp1 = (struct RxD1 *)rxdp;2929 dma_unmap_single(&ring_data->pdev->dev,2930 (dma_addr_t)rxdp1->Buffer0_ptr,2931 ring_data->mtu +2932 HEADER_ETHERNET_II_802_3_SIZE +2933 HEADER_802_2_SIZE +2934 HEADER_SNAP_SIZE,2935 DMA_FROM_DEVICE);2936 } else if (ring_data->rxd_mode == RXD_MODE_3B) {2937 rxdp3 = (struct RxD3 *)rxdp;2938 dma_sync_single_for_cpu(&ring_data->pdev->dev,2939 (dma_addr_t)rxdp3->Buffer0_ptr,2940 BUF0_LEN, DMA_FROM_DEVICE);2941 dma_unmap_single(&ring_data->pdev->dev,2942 (dma_addr_t)rxdp3->Buffer2_ptr,2943 ring_data->mtu + 4, DMA_FROM_DEVICE);2944 }2945 prefetch(skb->data);2946 rx_osm_handler(ring_data, rxdp);2947 get_info.offset++;2948 ring_data->rx_curr_get_info.offset = get_info.offset;2949 rxdp = ring_data->rx_blocks[get_block].2950 rxds[get_info.offset].virt_addr;2951 if (get_info.offset == rxd_count[ring_data->rxd_mode]) {2952 get_info.offset = 0;2953 ring_data->rx_curr_get_info.offset = get_info.offset;2954 get_block++;2955 if (get_block == ring_data->block_count)2956 get_block = 0;2957 ring_data->rx_curr_get_info.block_index = get_block;2958 rxdp = ring_data->rx_blocks[get_block].block_virt_addr;2959 }2960 2961 if (ring_data->nic->config.napi) {2962 budget--;2963 napi_pkts++;2964 if (!budget)2965 break;2966 }2967 pkt_cnt++;2968 if ((indicate_max_pkts) && (pkt_cnt > indicate_max_pkts))2969 break;2970 }2971 if (ring_data->lro) {2972 /* Clear all LRO sessions before exiting */2973 for (i = 0; i < MAX_LRO_SESSIONS; i++) {2974 struct lro *lro = &ring_data->lro0_n[i];2975 if (lro->in_use) {2976 update_L3L4_header(ring_data->nic, lro);2977 queue_rx_frame(lro->parent, lro->vlan_tag);2978 clear_lro_session(lro);2979 }2980 }2981 }2982 return napi_pkts;2983}2984 2985/**2986 * tx_intr_handler - Transmit interrupt handler2987 * @fifo_data : fifo data pointer2988 * Description:2989 * If an interrupt was raised to indicate DMA complete of the2990 * Tx packet, this function is called. It identifies the last TxD2991 * whose buffer was freed and frees all skbs whose data have already2992 * DMA'ed into the NICs internal memory.2993 * Return Value:2994 * NONE2995 */2996 2997static void tx_intr_handler(struct fifo_info *fifo_data)2998{2999 struct s2io_nic *nic = fifo_data->nic;3000 struct tx_curr_get_info get_info, put_info;3001 struct sk_buff *skb = NULL;3002 struct TxD *txdlp;3003 int pkt_cnt = 0;3004 unsigned long flags = 0;3005 u8 err_mask;3006 struct stat_block *stats = nic->mac_control.stats_info;3007 struct swStat *swstats = &stats->sw_stat;3008 3009 if (!spin_trylock_irqsave(&fifo_data->tx_lock, flags))3010 return;3011 3012 get_info = fifo_data->tx_curr_get_info;3013 memcpy(&put_info, &fifo_data->tx_curr_put_info, sizeof(put_info));3014 txdlp = fifo_data->list_info[get_info.offset].list_virt_addr;3015 while ((!(txdlp->Control_1 & TXD_LIST_OWN_XENA)) &&3016 (get_info.offset != put_info.offset) &&3017 (txdlp->Host_Control)) {3018 /* Check for TxD errors */3019 if (txdlp->Control_1 & TXD_T_CODE) {3020 unsigned long long err;3021 err = txdlp->Control_1 & TXD_T_CODE;3022 if (err & 0x1) {3023 swstats->parity_err_cnt++;3024 }3025 3026 /* update t_code statistics */3027 err_mask = err >> 48;3028 switch (err_mask) {3029 case 2:3030 swstats->tx_buf_abort_cnt++;3031 break;3032 3033 case 3:3034 swstats->tx_desc_abort_cnt++;3035 break;3036 3037 case 7:3038 swstats->tx_parity_err_cnt++;3039 break;3040 3041 case 10:3042 swstats->tx_link_loss_cnt++;3043 break;3044 3045 case 15:3046 swstats->tx_list_proc_err_cnt++;3047 break;3048 }3049 }3050 3051 skb = s2io_txdl_getskb(fifo_data, txdlp, get_info.offset);3052 if (skb == NULL) {3053 spin_unlock_irqrestore(&fifo_data->tx_lock, flags);3054 DBG_PRINT(ERR_DBG, "%s: NULL skb in Tx Free Intr\n",3055 __func__);3056 return;3057 }3058 pkt_cnt++;3059 3060 /* Updating the statistics block */3061 swstats->mem_freed += skb->truesize;3062 dev_consume_skb_irq(skb);3063 3064 get_info.offset++;3065 if (get_info.offset == get_info.fifo_len + 1)3066 get_info.offset = 0;3067 txdlp = fifo_data->list_info[get_info.offset].list_virt_addr;3068 fifo_data->tx_curr_get_info.offset = get_info.offset;3069 }3070 3071 s2io_wake_tx_queue(fifo_data, pkt_cnt, nic->config.multiq);3072 3073 spin_unlock_irqrestore(&fifo_data->tx_lock, flags);3074}3075 3076/**3077 * s2io_mdio_write - Function to write in to MDIO registers3078 * @mmd_type : MMD type value (PMA/PMD/WIS/PCS/PHYXS)3079 * @addr : address value3080 * @value : data value3081 * @dev : pointer to net_device structure3082 * Description:3083 * This function is used to write values to the MDIO registers3084 * NONE3085 */3086static void s2io_mdio_write(u32 mmd_type, u64 addr, u16 value,3087 struct net_device *dev)3088{3089 u64 val64;3090 struct s2io_nic *sp = netdev_priv(dev);3091 struct XENA_dev_config __iomem *bar0 = sp->bar0;3092 3093 /* address transaction */3094 val64 = MDIO_MMD_INDX_ADDR(addr) |3095 MDIO_MMD_DEV_ADDR(mmd_type) |3096 MDIO_MMS_PRT_ADDR(0x0);3097 writeq(val64, &bar0->mdio_control);3098 val64 = val64 | MDIO_CTRL_START_TRANS(0xE);3099 writeq(val64, &bar0->mdio_control);3100 udelay(100);3101 3102 /* Data transaction */3103 val64 = MDIO_MMD_INDX_ADDR(addr) |3104 MDIO_MMD_DEV_ADDR(mmd_type) |3105 MDIO_MMS_PRT_ADDR(0x0) |3106 MDIO_MDIO_DATA(value) |3107 MDIO_OP(MDIO_OP_WRITE_TRANS);3108 writeq(val64, &bar0->mdio_control);3109 val64 = val64 | MDIO_CTRL_START_TRANS(0xE);3110 writeq(val64, &bar0->mdio_control);3111 udelay(100);3112 3113 val64 = MDIO_MMD_INDX_ADDR(addr) |3114 MDIO_MMD_DEV_ADDR(mmd_type) |3115 MDIO_MMS_PRT_ADDR(0x0) |3116 MDIO_OP(MDIO_OP_READ_TRANS);3117 writeq(val64, &bar0->mdio_control);3118 val64 = val64 | MDIO_CTRL_START_TRANS(0xE);3119 writeq(val64, &bar0->mdio_control);3120 udelay(100);3121}3122 3123/**3124 * s2io_mdio_read - Function to write in to MDIO registers3125 * @mmd_type : MMD type value (PMA/PMD/WIS/PCS/PHYXS)3126 * @addr : address value3127 * @dev : pointer to net_device structure3128 * Description:3129 * This function is used to read values to the MDIO registers3130 * NONE3131 */3132static u64 s2io_mdio_read(u32 mmd_type, u64 addr, struct net_device *dev)3133{3134 u64 val64 = 0x0;3135 u64 rval64 = 0x0;3136 struct s2io_nic *sp = netdev_priv(dev);3137 struct XENA_dev_config __iomem *bar0 = sp->bar0;3138 3139 /* address transaction */3140 val64 = val64 | (MDIO_MMD_INDX_ADDR(addr)3141 | MDIO_MMD_DEV_ADDR(mmd_type)3142 | MDIO_MMS_PRT_ADDR(0x0));3143 writeq(val64, &bar0->mdio_control);3144 val64 = val64 | MDIO_CTRL_START_TRANS(0xE);3145 writeq(val64, &bar0->mdio_control);3146 udelay(100);3147 3148 /* Data transaction */3149 val64 = MDIO_MMD_INDX_ADDR(addr) |3150 MDIO_MMD_DEV_ADDR(mmd_type) |3151 MDIO_MMS_PRT_ADDR(0x0) |3152 MDIO_OP(MDIO_OP_READ_TRANS);3153 writeq(val64, &bar0->mdio_control);3154 val64 = val64 | MDIO_CTRL_START_TRANS(0xE);3155 writeq(val64, &bar0->mdio_control);3156 udelay(100);3157 3158 /* Read the value from regs */3159 rval64 = readq(&bar0->mdio_control);3160 rval64 = rval64 & 0xFFFF0000;3161 rval64 = rval64 >> 16;3162 return rval64;3163}3164 3165/**3166 * s2io_chk_xpak_counter - Function to check the status of the xpak counters3167 * @counter : counter value to be updated3168 * @regs_stat : registers status3169 * @index : index3170 * @flag : flag to indicate the status3171 * @type : counter type3172 * Description:3173 * This function is to check the status of the xpak counters value3174 * NONE3175 */3176 3177static void s2io_chk_xpak_counter(u64 *counter, u64 * regs_stat, u32 index,3178 u16 flag, u16 type)3179{3180 u64 mask = 0x3;3181 u64 val64;3182 int i;3183 for (i = 0; i < index; i++)3184 mask = mask << 0x2;3185 3186 if (flag > 0) {3187 *counter = *counter + 1;3188 val64 = *regs_stat & mask;3189 val64 = val64 >> (index * 0x2);3190 val64 = val64 + 1;3191 if (val64 == 3) {3192 switch (type) {3193 case 1:3194 DBG_PRINT(ERR_DBG,3195 "Take Xframe NIC out of service.\n");3196 DBG_PRINT(ERR_DBG,3197"Excessive temperatures may result in premature transceiver failure.\n");3198 break;3199 case 2:3200 DBG_PRINT(ERR_DBG,3201 "Take Xframe NIC out of service.\n");3202 DBG_PRINT(ERR_DBG,3203"Excessive bias currents may indicate imminent laser diode failure.\n");3204 break;3205 case 3:3206 DBG_PRINT(ERR_DBG,3207 "Take Xframe NIC out of service.\n");3208 DBG_PRINT(ERR_DBG,3209"Excessive laser output power may saturate far-end receiver.\n");3210 break;3211 default:3212 DBG_PRINT(ERR_DBG,3213 "Incorrect XPAK Alarm type\n");3214 }3215 val64 = 0x0;3216 }3217 val64 = val64 << (index * 0x2);3218 *regs_stat = (*regs_stat & (~mask)) | (val64);3219 3220 } else {3221 *regs_stat = *regs_stat & (~mask);3222 }3223}3224 3225/**3226 * s2io_updt_xpak_counter - Function to update the xpak counters3227 * @dev : pointer to net_device struct3228 * Description:3229 * This function is to upate the status of the xpak counters value3230 * NONE3231 */3232static void s2io_updt_xpak_counter(struct net_device *dev)3233{3234 u16 flag = 0x0;3235 u16 type = 0x0;3236 u16 val16 = 0x0;3237 u64 val64 = 0x0;3238 u64 addr = 0x0;3239 3240 struct s2io_nic *sp = netdev_priv(dev);3241 struct stat_block *stats = sp->mac_control.stats_info;3242 struct xpakStat *xstats = &stats->xpak_stat;3243 3244 /* Check the communication with the MDIO slave */3245 addr = MDIO_CTRL1;3246 val64 = 0x0;3247 val64 = s2io_mdio_read(MDIO_MMD_PMAPMD, addr, dev);3248 if ((val64 == 0xFFFF) || (val64 == 0x0000)) {3249 DBG_PRINT(ERR_DBG,3250 "ERR: MDIO slave access failed - Returned %llx\n",3251 (unsigned long long)val64);3252 return;3253 }3254 3255 /* Check for the expected value of control reg 1 */3256 if (val64 != MDIO_CTRL1_SPEED10G) {3257 DBG_PRINT(ERR_DBG, "Incorrect value at PMA address 0x0000 - "3258 "Returned: %llx- Expected: 0x%x\n",3259 (unsigned long long)val64, MDIO_CTRL1_SPEED10G);3260 return;3261 }3262 3263 /* Loading the DOM register to MDIO register */3264 addr = 0xA100;3265 s2io_mdio_write(MDIO_MMD_PMAPMD, addr, val16, dev);3266 val64 = s2io_mdio_read(MDIO_MMD_PMAPMD, addr, dev);3267 3268 /* Reading the Alarm flags */3269 addr = 0xA070;3270 val64 = 0x0;3271 val64 = s2io_mdio_read(MDIO_MMD_PMAPMD, addr, dev);3272 3273 flag = CHECKBIT(val64, 0x7);3274 type = 1;3275 s2io_chk_xpak_counter(&xstats->alarm_transceiver_temp_high,3276 &xstats->xpak_regs_stat,3277 0x0, flag, type);3278 3279 if (CHECKBIT(val64, 0x6))3280 xstats->alarm_transceiver_temp_low++;3281 3282 flag = CHECKBIT(val64, 0x3);3283 type = 2;3284 s2io_chk_xpak_counter(&xstats->alarm_laser_bias_current_high,3285 &xstats->xpak_regs_stat,3286 0x2, flag, type);3287 3288 if (CHECKBIT(val64, 0x2))3289 xstats->alarm_laser_bias_current_low++;3290 3291 flag = CHECKBIT(val64, 0x1);3292 type = 3;3293 s2io_chk_xpak_counter(&xstats->alarm_laser_output_power_high,3294 &xstats->xpak_regs_stat,3295 0x4, flag, type);3296 3297 if (CHECKBIT(val64, 0x0))3298 xstats->alarm_laser_output_power_low++;3299 3300 /* Reading the Warning flags */3301 addr = 0xA074;3302 val64 = 0x0;3303 val64 = s2io_mdio_read(MDIO_MMD_PMAPMD, addr, dev);3304 3305 if (CHECKBIT(val64, 0x7))3306 xstats->warn_transceiver_temp_high++;3307 3308 if (CHECKBIT(val64, 0x6))3309 xstats->warn_transceiver_temp_low++;3310 3311 if (CHECKBIT(val64, 0x3))3312 xstats->warn_laser_bias_current_high++;3313 3314 if (CHECKBIT(val64, 0x2))3315 xstats->warn_laser_bias_current_low++;3316 3317 if (CHECKBIT(val64, 0x1))3318 xstats->warn_laser_output_power_high++;3319 3320 if (CHECKBIT(val64, 0x0))3321 xstats->warn_laser_output_power_low++;3322}3323 3324/**3325 * wait_for_cmd_complete - waits for a command to complete.3326 * @addr: address3327 * @busy_bit: bit to check for busy3328 * @bit_state: state to check3329 * @may_sleep: parameter indicates if sleeping when waiting for3330 * command complete3331 * Description: Function that waits for a command to Write into RMAC3332 * ADDR DATA registers to be completed and returns either success or3333 * error depending on whether the command was complete or not.3334 * Return value:3335 * SUCCESS on success and FAILURE on failure.3336 */3337 3338static int wait_for_cmd_complete(void __iomem *addr, u64 busy_bit,3339 int bit_state, bool may_sleep)3340{3341 int ret = FAILURE, cnt = 0, delay = 1;3342 u64 val64;3343 3344 if ((bit_state != S2IO_BIT_RESET) && (bit_state != S2IO_BIT_SET))3345 return FAILURE;3346 3347 do {3348 val64 = readq(addr);3349 if (bit_state == S2IO_BIT_RESET) {3350 if (!(val64 & busy_bit)) {3351 ret = SUCCESS;3352 break;3353 }3354 } else {3355 if (val64 & busy_bit) {3356 ret = SUCCESS;3357 break;3358 }3359 }3360 3361 if (!may_sleep)3362 mdelay(delay);3363 else3364 msleep(delay);3365 3366 if (++cnt >= 10)3367 delay = 50;3368 } while (cnt < 20);3369 return ret;3370}3371/**3372 * check_pci_device_id - Checks if the device id is supported3373 * @id : device id3374 * Description: Function to check if the pci device id is supported by driver.3375 * Return value: Actual device id if supported else PCI_ANY_ID3376 */3377static u16 check_pci_device_id(u16 id)3378{3379 switch (id) {3380 case PCI_DEVICE_ID_HERC_WIN:3381 case PCI_DEVICE_ID_HERC_UNI:3382 return XFRAME_II_DEVICE;3383 case PCI_DEVICE_ID_S2IO_UNI:3384 case PCI_DEVICE_ID_S2IO_WIN:3385 return XFRAME_I_DEVICE;3386 default:3387 return PCI_ANY_ID;3388 }3389}3390 3391/**3392 * s2io_reset - Resets the card.3393 * @sp : private member of the device structure.3394 * Description: Function to Reset the card. This function then also3395 * restores the previously saved PCI configuration space registers as3396 * the card reset also resets the configuration space.3397 * Return value:3398 * void.3399 */3400 3401static void s2io_reset(struct s2io_nic *sp)3402{3403 struct XENA_dev_config __iomem *bar0 = sp->bar0;3404 u64 val64;3405 u16 subid, pci_cmd;3406 int i;3407 u16 val16;3408 unsigned long long up_cnt, down_cnt, up_time, down_time, reset_cnt;3409 unsigned long long mem_alloc_cnt, mem_free_cnt, watchdog_cnt;3410 struct stat_block *stats;3411 struct swStat *swstats;3412 3413 DBG_PRINT(INIT_DBG, "%s: Resetting XFrame card %s\n",3414 __func__, pci_name(sp->pdev));3415 3416 /* Back up the PCI-X CMD reg, dont want to lose MMRBC, OST settings */3417 pci_read_config_word(sp->pdev, PCIX_COMMAND_REGISTER, &(pci_cmd));3418 3419 val64 = SW_RESET_ALL;3420 writeq(val64, &bar0->sw_reset);3421 if (strstr(sp->product_name, "CX4"))3422 msleep(750);3423 msleep(250);3424 for (i = 0; i < S2IO_MAX_PCI_CONFIG_SPACE_REINIT; i++) {3425 3426 /* Restore the PCI state saved during initialization. */3427 pci_restore_state(sp->pdev);3428 pci_save_state(sp->pdev);3429 pci_read_config_word(sp->pdev, 0x2, &val16);3430 if (check_pci_device_id(val16) != (u16)PCI_ANY_ID)3431 break;3432 msleep(200);3433 }3434 3435 if (check_pci_device_id(val16) == (u16)PCI_ANY_ID)3436 DBG_PRINT(ERR_DBG, "%s SW_Reset failed!\n", __func__);3437 3438 pci_write_config_word(sp->pdev, PCIX_COMMAND_REGISTER, pci_cmd);3439 3440 s2io_init_pci(sp);3441 3442 /* Set swapper to enable I/O register access */3443 s2io_set_swapper(sp);3444 3445 /* restore mac_addr entries */3446 do_s2io_restore_unicast_mc(sp);3447 3448 /* Restore the MSIX table entries from local variables */3449 restore_xmsi_data(sp);3450 3451 /* Clear certain PCI/PCI-X fields after reset */3452 if (sp->device_type == XFRAME_II_DEVICE) {3453 /* Clear "detected parity error" bit */3454 pci_write_config_word(sp->pdev, PCI_STATUS, 0x8000);3455 3456 /* Clearing PCIX Ecc status register */3457 pci_write_config_dword(sp->pdev, 0x68, 0x7C);3458 3459 /* Clearing PCI_STATUS error reflected here */3460 writeq(s2BIT(62), &bar0->txpic_int_reg);3461 }3462 3463 /* Reset device statistics maintained by OS */3464 memset(&sp->stats, 0, sizeof(struct net_device_stats));3465 3466 stats = sp->mac_control.stats_info;3467 swstats = &stats->sw_stat;3468 3469 /* save link up/down time/cnt, reset/memory/watchdog cnt */3470 up_cnt = swstats->link_up_cnt;3471 down_cnt = swstats->link_down_cnt;3472 up_time = swstats->link_up_time;3473 down_time = swstats->link_down_time;3474 reset_cnt = swstats->soft_reset_cnt;3475 mem_alloc_cnt = swstats->mem_allocated;3476 mem_free_cnt = swstats->mem_freed;3477 watchdog_cnt = swstats->watchdog_timer_cnt;3478 3479 memset(stats, 0, sizeof(struct stat_block));3480 3481 /* restore link up/down time/cnt, reset/memory/watchdog cnt */3482 swstats->link_up_cnt = up_cnt;3483 swstats->link_down_cnt = down_cnt;3484 swstats->link_up_time = up_time;3485 swstats->link_down_time = down_time;3486 swstats->soft_reset_cnt = reset_cnt;3487 swstats->mem_allocated = mem_alloc_cnt;3488 swstats->mem_freed = mem_free_cnt;3489 swstats->watchdog_timer_cnt = watchdog_cnt;3490 3491 /* SXE-002: Configure link and activity LED to turn it off */3492 subid = sp->pdev->subsystem_device;3493 if (((subid & 0xFF) >= 0x07) &&3494 (sp->device_type == XFRAME_I_DEVICE)) {3495 val64 = readq(&bar0->gpio_control);3496 val64 |= 0x0000800000000000ULL;3497 writeq(val64, &bar0->gpio_control);3498 val64 = 0x0411040400000000ULL;3499 writeq(val64, (void __iomem *)bar0 + 0x2700);3500 }3501 3502 /*3503 * Clear spurious ECC interrupts that would have occurred on3504 * XFRAME II cards after reset.3505 */3506 if (sp->device_type == XFRAME_II_DEVICE) {3507 val64 = readq(&bar0->pcc_err_reg);3508 writeq(val64, &bar0->pcc_err_reg);3509 }3510 3511 sp->device_enabled_once = false;3512}3513 3514/**3515 * s2io_set_swapper - to set the swapper controle on the card3516 * @sp : private member of the device structure,3517 * pointer to the s2io_nic structure.3518 * Description: Function to set the swapper control on the card3519 * correctly depending on the 'endianness' of the system.3520 * Return value:3521 * SUCCESS on success and FAILURE on failure.3522 */3523 3524static int s2io_set_swapper(struct s2io_nic *sp)3525{3526 struct net_device *dev = sp->dev;3527 struct XENA_dev_config __iomem *bar0 = sp->bar0;3528 u64 val64, valt, valr;3529 3530 /*3531 * Set proper endian settings and verify the same by reading3532 * the PIF Feed-back register.3533 */3534 3535 val64 = readq(&bar0->pif_rd_swapper_fb);3536 if (val64 != 0x0123456789ABCDEFULL) {3537 int i = 0;3538 static const u64 value[] = {3539 0xC30000C3C30000C3ULL, /* FE=1, SE=1 */3540 0x8100008181000081ULL, /* FE=1, SE=0 */3541 0x4200004242000042ULL, /* FE=0, SE=1 */3542 0 /* FE=0, SE=0 */3543 };3544 3545 while (i < 4) {3546 writeq(value[i], &bar0->swapper_ctrl);3547 val64 = readq(&bar0->pif_rd_swapper_fb);3548 if (val64 == 0x0123456789ABCDEFULL)3549 break;3550 i++;3551 }3552 if (i == 4) {3553 DBG_PRINT(ERR_DBG, "%s: Endian settings are wrong, "3554 "feedback read %llx\n",3555 dev->name, (unsigned long long)val64);3556 return FAILURE;3557 }3558 valr = value[i];3559 } else {3560 valr = readq(&bar0->swapper_ctrl);3561 }3562 3563 valt = 0x0123456789ABCDEFULL;3564 writeq(valt, &bar0->xmsi_address);3565 val64 = readq(&bar0->xmsi_address);3566 3567 if (val64 != valt) {3568 int i = 0;3569 static const u64 value[] = {3570 0x00C3C30000C3C300ULL, /* FE=1, SE=1 */3571 0x0081810000818100ULL, /* FE=1, SE=0 */3572 0x0042420000424200ULL, /* FE=0, SE=1 */3573 0 /* FE=0, SE=0 */3574 };3575 3576 while (i < 4) {3577 writeq((value[i] | valr), &bar0->swapper_ctrl);3578 writeq(valt, &bar0->xmsi_address);3579 val64 = readq(&bar0->xmsi_address);3580 if (val64 == valt)3581 break;3582 i++;3583 }3584 if (i == 4) {3585 unsigned long long x = val64;3586 DBG_PRINT(ERR_DBG,3587 "Write failed, Xmsi_addr reads:0x%llx\n", x);3588 return FAILURE;3589 }3590 }3591 val64 = readq(&bar0->swapper_ctrl);3592 val64 &= 0xFFFF000000000000ULL;3593 3594#ifdef __BIG_ENDIAN3595 /*3596 * The device by default set to a big endian format, so a3597 * big endian driver need not set anything.3598 */3599 val64 |= (SWAPPER_CTRL_TXP_FE |3600 SWAPPER_CTRL_TXP_SE |3601 SWAPPER_CTRL_TXD_R_FE |3602 SWAPPER_CTRL_TXD_W_FE |3603 SWAPPER_CTRL_TXF_R_FE |3604 SWAPPER_CTRL_RXD_R_FE |3605 SWAPPER_CTRL_RXD_W_FE |3606 SWAPPER_CTRL_RXF_W_FE |3607 SWAPPER_CTRL_XMSI_FE |3608 SWAPPER_CTRL_STATS_FE |3609 SWAPPER_CTRL_STATS_SE);3610 if (sp->config.intr_type == INTA)3611 val64 |= SWAPPER_CTRL_XMSI_SE;3612 writeq(val64, &bar0->swapper_ctrl);3613#else3614 /*3615 * Initially we enable all bits to make it accessible by the3616 * driver, then we selectively enable only those bits that3617 * we want to set.3618 */3619 val64 |= (SWAPPER_CTRL_TXP_FE |3620 SWAPPER_CTRL_TXP_SE |3621 SWAPPER_CTRL_TXD_R_FE |3622 SWAPPER_CTRL_TXD_R_SE |3623 SWAPPER_CTRL_TXD_W_FE |3624 SWAPPER_CTRL_TXD_W_SE |3625 SWAPPER_CTRL_TXF_R_FE |3626 SWAPPER_CTRL_RXD_R_FE |3627 SWAPPER_CTRL_RXD_R_SE |3628 SWAPPER_CTRL_RXD_W_FE |3629 SWAPPER_CTRL_RXD_W_SE |3630 SWAPPER_CTRL_RXF_W_FE |3631 SWAPPER_CTRL_XMSI_FE |3632 SWAPPER_CTRL_STATS_FE |3633 SWAPPER_CTRL_STATS_SE);3634 if (sp->config.intr_type == INTA)3635 val64 |= SWAPPER_CTRL_XMSI_SE;3636 writeq(val64, &bar0->swapper_ctrl);3637#endif3638 val64 = readq(&bar0->swapper_ctrl);3639 3640 /*3641 * Verifying if endian settings are accurate by reading a3642 * feedback register.3643 */3644 val64 = readq(&bar0->pif_rd_swapper_fb);3645 if (val64 != 0x0123456789ABCDEFULL) {3646 /* Endian settings are incorrect, calls for another dekko. */3647 DBG_PRINT(ERR_DBG,3648 "%s: Endian settings are wrong, feedback read %llx\n",3649 dev->name, (unsigned long long)val64);3650 return FAILURE;3651 }3652 3653 return SUCCESS;3654}3655 3656static int wait_for_msix_trans(struct s2io_nic *nic, int i)3657{3658 struct XENA_dev_config __iomem *bar0 = nic->bar0;3659 u64 val64;3660 int ret = 0, cnt = 0;3661 3662 do {3663 val64 = readq(&bar0->xmsi_access);3664 if (!(val64 & s2BIT(15)))3665 break;3666 mdelay(1);3667 cnt++;3668 } while (cnt < 5);3669 if (cnt == 5) {3670 DBG_PRINT(ERR_DBG, "XMSI # %d Access failed\n", i);3671 ret = 1;3672 }3673 3674 return ret;3675}3676 3677static void restore_xmsi_data(struct s2io_nic *nic)3678{3679 struct XENA_dev_config __iomem *bar0 = nic->bar0;3680 u64 val64;3681 int i, msix_index;3682 3683 if (nic->device_type == XFRAME_I_DEVICE)3684 return;3685 3686 for (i = 0; i < MAX_REQUESTED_MSI_X; i++) {3687 msix_index = (i) ? ((i-1) * 8 + 1) : 0;3688 writeq(nic->msix_info[i].addr, &bar0->xmsi_address);3689 writeq(nic->msix_info[i].data, &bar0->xmsi_data);3690 val64 = (s2BIT(7) | s2BIT(15) | vBIT(msix_index, 26, 6));3691 writeq(val64, &bar0->xmsi_access);3692 if (wait_for_msix_trans(nic, msix_index))3693 DBG_PRINT(ERR_DBG, "%s: index: %d failed\n",3694 __func__, msix_index);3695 }3696}3697 3698static void store_xmsi_data(struct s2io_nic *nic)3699{3700 struct XENA_dev_config __iomem *bar0 = nic->bar0;3701 u64 val64, addr, data;3702 int i, msix_index;3703 3704 if (nic->device_type == XFRAME_I_DEVICE)3705 return;3706 3707 /* Store and display */3708 for (i = 0; i < MAX_REQUESTED_MSI_X; i++) {3709 msix_index = (i) ? ((i-1) * 8 + 1) : 0;3710 val64 = (s2BIT(15) | vBIT(msix_index, 26, 6));3711 writeq(val64, &bar0->xmsi_access);3712 if (wait_for_msix_trans(nic, msix_index)) {3713 DBG_PRINT(ERR_DBG, "%s: index: %d failed\n",3714 __func__, msix_index);3715 continue;3716 }3717 addr = readq(&bar0->xmsi_address);3718 data = readq(&bar0->xmsi_data);3719 if (addr && data) {3720 nic->msix_info[i].addr = addr;3721 nic->msix_info[i].data = data;3722 }3723 }3724}3725 3726static int s2io_enable_msi_x(struct s2io_nic *nic)3727{3728 struct XENA_dev_config __iomem *bar0 = nic->bar0;3729 u64 rx_mat;3730 u16 msi_control; /* Temp variable */3731 int ret, i, j, msix_indx = 1;3732 int size;3733 struct stat_block *stats = nic->mac_control.stats_info;3734 struct swStat *swstats = &stats->sw_stat;3735 3736 size = nic->num_entries * sizeof(struct msix_entry);3737 nic->entries = kzalloc(size, GFP_KERNEL);3738 if (!nic->entries) {3739 DBG_PRINT(INFO_DBG, "%s: Memory allocation failed\n",3740 __func__);3741 swstats->mem_alloc_fail_cnt++;3742 return -ENOMEM;3743 }3744 swstats->mem_allocated += size;3745 3746 size = nic->num_entries * sizeof(struct s2io_msix_entry);3747 nic->s2io_entries = kzalloc(size, GFP_KERNEL);3748 if (!nic->s2io_entries) {3749 DBG_PRINT(INFO_DBG, "%s: Memory allocation failed\n",3750 __func__);3751 swstats->mem_alloc_fail_cnt++;3752 kfree(nic->entries);3753 swstats->mem_freed3754 += (nic->num_entries * sizeof(struct msix_entry));3755 return -ENOMEM;3756 }3757 swstats->mem_allocated += size;3758 3759 nic->entries[0].entry = 0;3760 nic->s2io_entries[0].entry = 0;3761 nic->s2io_entries[0].in_use = MSIX_FLG;3762 nic->s2io_entries[0].type = MSIX_ALARM_TYPE;3763 nic->s2io_entries[0].arg = &nic->mac_control.fifos;3764 3765 for (i = 1; i < nic->num_entries; i++) {3766 nic->entries[i].entry = ((i - 1) * 8) + 1;3767 nic->s2io_entries[i].entry = ((i - 1) * 8) + 1;3768 nic->s2io_entries[i].arg = NULL;3769 nic->s2io_entries[i].in_use = 0;3770 }3771 3772 rx_mat = readq(&bar0->rx_mat);3773 for (j = 0; j < nic->config.rx_ring_num; j++) {3774 rx_mat |= RX_MAT_SET(j, msix_indx);3775 nic->s2io_entries[j+1].arg = &nic->mac_control.rings[j];3776 nic->s2io_entries[j+1].type = MSIX_RING_TYPE;3777 nic->s2io_entries[j+1].in_use = MSIX_FLG;3778 msix_indx += 8;3779 }3780 writeq(rx_mat, &bar0->rx_mat);3781 readq(&bar0->rx_mat);3782 3783 ret = pci_enable_msix_range(nic->pdev, nic->entries,3784 nic->num_entries, nic->num_entries);3785 /* We fail init if error or we get less vectors than min required */3786 if (ret < 0) {3787 DBG_PRINT(ERR_DBG, "Enabling MSI-X failed\n");3788 kfree(nic->entries);3789 swstats->mem_freed += nic->num_entries *3790 sizeof(struct msix_entry);3791 kfree(nic->s2io_entries);3792 swstats->mem_freed += nic->num_entries *3793 sizeof(struct s2io_msix_entry);3794 nic->entries = NULL;3795 nic->s2io_entries = NULL;3796 return -ENOMEM;3797 }3798 3799 /*3800 * To enable MSI-X, MSI also needs to be enabled, due to a bug3801 * in the herc NIC. (Temp change, needs to be removed later)3802 */3803 pci_read_config_word(nic->pdev, 0x42, &msi_control);3804 msi_control |= 0x1; /* Enable MSI */3805 pci_write_config_word(nic->pdev, 0x42, msi_control);3806 3807 return 0;3808}3809 3810/* Handle software interrupt used during MSI(X) test */3811static irqreturn_t s2io_test_intr(int irq, void *dev_id)3812{3813 struct s2io_nic *sp = dev_id;3814 3815 sp->msi_detected = 1;3816 wake_up(&sp->msi_wait);3817 3818 return IRQ_HANDLED;3819}3820 3821/* Test interrupt path by forcing a software IRQ */3822static int s2io_test_msi(struct s2io_nic *sp)3823{3824 struct pci_dev *pdev = sp->pdev;3825 struct XENA_dev_config __iomem *bar0 = sp->bar0;3826 int err;3827 u64 val64, saved64;3828 3829 err = request_irq(sp->entries[1].vector, s2io_test_intr, 0,3830 sp->name, sp);3831 if (err) {3832 DBG_PRINT(ERR_DBG, "%s: PCI %s: cannot assign irq %d\n",3833 sp->dev->name, pci_name(pdev), pdev->irq);3834 return err;3835 }3836 3837 init_waitqueue_head(&sp->msi_wait);3838 sp->msi_detected = 0;3839 3840 saved64 = val64 = readq(&bar0->scheduled_int_ctrl);3841 val64 |= SCHED_INT_CTRL_ONE_SHOT;3842 val64 |= SCHED_INT_CTRL_TIMER_EN;3843 val64 |= SCHED_INT_CTRL_INT2MSI(1);3844 writeq(val64, &bar0->scheduled_int_ctrl);3845 3846 wait_event_timeout(sp->msi_wait, sp->msi_detected, HZ/10);3847 3848 if (!sp->msi_detected) {3849 /* MSI(X) test failed, go back to INTx mode */3850 DBG_PRINT(ERR_DBG, "%s: PCI %s: No interrupt was generated "3851 "using MSI(X) during test\n",3852 sp->dev->name, pci_name(pdev));3853 3854 err = -EOPNOTSUPP;3855 }3856 3857 free_irq(sp->entries[1].vector, sp);3858 3859 writeq(saved64, &bar0->scheduled_int_ctrl);3860 3861 return err;3862}3863 3864static void remove_msix_isr(struct s2io_nic *sp)3865{3866 int i;3867 u16 msi_control;3868 3869 for (i = 0; i < sp->num_entries; i++) {3870 if (sp->s2io_entries[i].in_use == MSIX_REGISTERED_SUCCESS) {3871 int vector = sp->entries[i].vector;3872 void *arg = sp->s2io_entries[i].arg;3873 free_irq(vector, arg);3874 }3875 }3876 3877 kfree(sp->entries);3878 kfree(sp->s2io_entries);3879 sp->entries = NULL;3880 sp->s2io_entries = NULL;3881 3882 pci_read_config_word(sp->pdev, 0x42, &msi_control);3883 msi_control &= 0xFFFE; /* Disable MSI */3884 pci_write_config_word(sp->pdev, 0x42, msi_control);3885 3886 pci_disable_msix(sp->pdev);3887}3888 3889static void remove_inta_isr(struct s2io_nic *sp)3890{3891 free_irq(sp->pdev->irq, sp->dev);3892}3893 3894/* ********************************************************* *3895 * Functions defined below concern the OS part of the driver *3896 * ********************************************************* */3897 3898/**3899 * s2io_open - open entry point of the driver3900 * @dev : pointer to the device structure.3901 * Description:3902 * This function is the open entry point of the driver. It mainly calls a3903 * function to allocate Rx buffers and inserts them into the buffer3904 * descriptors and then enables the Rx part of the NIC.3905 * Return value:3906 * 0 on success and an appropriate (-)ve integer as defined in errno.h3907 * file on failure.3908 */3909 3910static int s2io_open(struct net_device *dev)3911{3912 struct s2io_nic *sp = netdev_priv(dev);3913 struct swStat *swstats = &sp->mac_control.stats_info->sw_stat;3914 int err = 0;3915 3916 /*3917 * Make sure you have link off by default every time3918 * Nic is initialized3919 */3920 netif_carrier_off(dev);3921 sp->last_link_state = 0;3922 3923 /* Initialize H/W and enable interrupts */3924 err = s2io_card_up(sp);3925 if (err) {3926 DBG_PRINT(ERR_DBG, "%s: H/W initialization failed\n",3927 dev->name);3928 goto hw_init_failed;3929 }3930 3931 if (do_s2io_prog_unicast(dev, dev->dev_addr) == FAILURE) {3932 DBG_PRINT(ERR_DBG, "Set Mac Address Failed\n");3933 s2io_card_down(sp);3934 err = -ENODEV;3935 goto hw_init_failed;3936 }3937 s2io_start_all_tx_queue(sp);3938 return 0;3939 3940hw_init_failed:3941 if (sp->config.intr_type == MSI_X) {3942 if (sp->entries) {3943 kfree(sp->entries);3944 swstats->mem_freed += sp->num_entries *3945 sizeof(struct msix_entry);3946 }3947 if (sp->s2io_entries) {3948 kfree(sp->s2io_entries);3949 swstats->mem_freed += sp->num_entries *3950 sizeof(struct s2io_msix_entry);3951 }3952 }3953 return err;3954}3955 3956/**3957 * s2io_close -close entry point of the driver3958 * @dev : device pointer.3959 * Description:3960 * This is the stop entry point of the driver. It needs to undo exactly3961 * whatever was done by the open entry point,thus it's usually referred to3962 * as the close function.Among other things this function mainly stops the3963 * Rx side of the NIC and frees all the Rx buffers in the Rx rings.3964 * Return value:3965 * 0 on success and an appropriate (-)ve integer as defined in errno.h3966 * file on failure.3967 */3968 3969static int s2io_close(struct net_device *dev)3970{3971 struct s2io_nic *sp = netdev_priv(dev);3972 struct config_param *config = &sp->config;3973 u64 tmp64;3974 int offset;3975 3976 /* Return if the device is already closed *3977 * Can happen when s2io_card_up failed in change_mtu *3978 */3979 if (!is_s2io_card_up(sp))3980 return 0;3981 3982 s2io_stop_all_tx_queue(sp);3983 /* delete all populated mac entries */3984 for (offset = 1; offset < config->max_mc_addr; offset++) {3985 tmp64 = do_s2io_read_unicast_mc(sp, offset);3986 if (tmp64 != S2IO_DISABLE_MAC_ENTRY)3987 do_s2io_delete_unicast_mc(sp, tmp64);3988 }3989 3990 s2io_card_down(sp);3991 3992 return 0;3993}3994 3995/**3996 * s2io_xmit - Tx entry point of te driver3997 * @skb : the socket buffer containing the Tx data.3998 * @dev : device pointer.3999 * Description :4000 * This function is the Tx entry point of the driver. S2IO NIC supports4001 * certain protocol assist features on Tx side, namely CSO, S/G, LSO.4002 * NOTE: when device can't queue the pkt,just the trans_start variable will4003 * not be upadted.4004 * Return value:4005 * 0 on success & 1 on failure.4006 */4007 4008static netdev_tx_t s2io_xmit(struct sk_buff *skb, struct net_device *dev)4009{4010 struct s2io_nic *sp = netdev_priv(dev);4011 u16 frg_cnt, frg_len, i, queue, queue_len, put_off, get_off;4012 register u64 val64;4013 struct TxD *txdp;4014 struct TxFIFO_element __iomem *tx_fifo;4015 unsigned long flags = 0;4016 u16 vlan_tag = 0;4017 struct fifo_info *fifo = NULL;4018 int offload_type;4019 int enable_per_list_interrupt = 0;4020 struct config_param *config = &sp->config;4021 struct mac_info *mac_control = &sp->mac_control;4022 struct stat_block *stats = mac_control->stats_info;4023 struct swStat *swstats = &stats->sw_stat;4024 4025 DBG_PRINT(TX_DBG, "%s: In Neterion Tx routine\n", dev->name);4026 4027 if (unlikely(skb->len <= 0)) {4028 DBG_PRINT(TX_DBG, "%s: Buffer has no data..\n", dev->name);4029 dev_kfree_skb_any(skb);4030 return NETDEV_TX_OK;4031 }4032 4033 if (!is_s2io_card_up(sp)) {4034 DBG_PRINT(TX_DBG, "%s: Card going down for reset\n",4035 dev->name);4036 dev_kfree_skb_any(skb);4037 return NETDEV_TX_OK;4038 }4039 4040 queue = 0;4041 if (skb_vlan_tag_present(skb))4042 vlan_tag = skb_vlan_tag_get(skb);4043 if (sp->config.tx_steering_type == TX_DEFAULT_STEERING) {4044 if (skb->protocol == htons(ETH_P_IP)) {4045 struct iphdr *ip;4046 struct tcphdr *th;4047 ip = ip_hdr(skb);4048 4049 if (!ip_is_fragment(ip)) {4050 th = (struct tcphdr *)(((unsigned char *)ip) +4051 ip->ihl*4);4052 4053 if (ip->protocol == IPPROTO_TCP) {4054 queue_len = sp->total_tcp_fifos;4055 queue = (ntohs(th->source) +4056 ntohs(th->dest)) &4057 sp->fifo_selector[queue_len - 1];4058 if (queue >= queue_len)4059 queue = queue_len - 1;4060 } else if (ip->protocol == IPPROTO_UDP) {4061 queue_len = sp->total_udp_fifos;4062 queue = (ntohs(th->source) +4063 ntohs(th->dest)) &4064 sp->fifo_selector[queue_len - 1];4065 if (queue >= queue_len)4066 queue = queue_len - 1;4067 queue += sp->udp_fifo_idx;4068 if (skb->len > 1024)4069 enable_per_list_interrupt = 1;4070 }4071 }4072 }4073 } else if (sp->config.tx_steering_type == TX_PRIORITY_STEERING)4074 /* get fifo number based on skb->priority value */4075 queue = config->fifo_mapping4076 [skb->priority & (MAX_TX_FIFOS - 1)];4077 fifo = &mac_control->fifos[queue];4078 4079 spin_lock_irqsave(&fifo->tx_lock, flags);4080 4081 if (sp->config.multiq) {4082 if (__netif_subqueue_stopped(dev, fifo->fifo_no)) {4083 spin_unlock_irqrestore(&fifo->tx_lock, flags);4084 return NETDEV_TX_BUSY;4085 }4086 } else if (unlikely(fifo->queue_state == FIFO_QUEUE_STOP)) {4087 if (netif_queue_stopped(dev)) {4088 spin_unlock_irqrestore(&fifo->tx_lock, flags);4089 return NETDEV_TX_BUSY;4090 }4091 }4092 4093 put_off = (u16)fifo->tx_curr_put_info.offset;4094 get_off = (u16)fifo->tx_curr_get_info.offset;4095 txdp = fifo->list_info[put_off].list_virt_addr;4096 4097 queue_len = fifo->tx_curr_put_info.fifo_len + 1;4098 /* Avoid "put" pointer going beyond "get" pointer */4099 if (txdp->Host_Control ||4100 ((put_off+1) == queue_len ? 0 : (put_off+1)) == get_off) {4101 DBG_PRINT(TX_DBG, "Error in xmit, No free TXDs.\n");4102 s2io_stop_tx_queue(sp, fifo->fifo_no);4103 dev_kfree_skb_any(skb);4104 spin_unlock_irqrestore(&fifo->tx_lock, flags);4105 return NETDEV_TX_OK;4106 }4107 4108 offload_type = s2io_offload_type(skb);4109 if (offload_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)) {4110 txdp->Control_1 |= TXD_TCP_LSO_EN;4111 txdp->Control_1 |= TXD_TCP_LSO_MSS(s2io_tcp_mss(skb));4112 }4113 if (skb->ip_summed == CHECKSUM_PARTIAL) {4114 txdp->Control_2 |= (TXD_TX_CKO_IPV4_EN |4115 TXD_TX_CKO_TCP_EN |4116 TXD_TX_CKO_UDP_EN);4117 }4118 txdp->Control_1 |= TXD_GATHER_CODE_FIRST;4119 txdp->Control_1 |= TXD_LIST_OWN_XENA;4120 txdp->Control_2 |= TXD_INT_NUMBER(fifo->fifo_no);4121 if (enable_per_list_interrupt)4122 if (put_off & (queue_len >> 5))4123 txdp->Control_2 |= TXD_INT_TYPE_PER_LIST;4124 if (vlan_tag) {4125 txdp->Control_2 |= TXD_VLAN_ENABLE;4126 txdp->Control_2 |= TXD_VLAN_TAG(vlan_tag);4127 }4128 4129 frg_len = skb_headlen(skb);4130 txdp->Buffer_Pointer = dma_map_single(&sp->pdev->dev, skb->data,4131 frg_len, DMA_TO_DEVICE);4132 if (dma_mapping_error(&sp->pdev->dev, txdp->Buffer_Pointer))4133 goto pci_map_failed;4134 4135 txdp->Host_Control = (unsigned long)skb;4136 txdp->Control_1 |= TXD_BUFFER0_SIZE(frg_len);4137 4138 frg_cnt = skb_shinfo(skb)->nr_frags;4139 /* For fragmented SKB. */4140 for (i = 0; i < frg_cnt; i++) {4141 const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];4142 /* A '0' length fragment will be ignored */4143 if (!skb_frag_size(frag))4144 continue;4145 txdp++;4146 txdp->Buffer_Pointer = (u64)skb_frag_dma_map(&sp->pdev->dev,4147 frag, 0,4148 skb_frag_size(frag),4149 DMA_TO_DEVICE);4150 txdp->Control_1 = TXD_BUFFER0_SIZE(skb_frag_size(frag));4151 }4152 txdp->Control_1 |= TXD_GATHER_CODE_LAST;4153 4154 tx_fifo = mac_control->tx_FIFO_start[queue];4155 val64 = fifo->list_info[put_off].list_phy_addr;4156 writeq(val64, &tx_fifo->TxDL_Pointer);4157 4158 val64 = (TX_FIFO_LAST_TXD_NUM(frg_cnt) | TX_FIFO_FIRST_LIST |4159 TX_FIFO_LAST_LIST);4160 if (offload_type)4161 val64 |= TX_FIFO_SPECIAL_FUNC;4162 4163 writeq(val64, &tx_fifo->List_Control);4164 4165 put_off++;4166 if (put_off == fifo->tx_curr_put_info.fifo_len + 1)4167 put_off = 0;4168 fifo->tx_curr_put_info.offset = put_off;4169 4170 /* Avoid "put" pointer going beyond "get" pointer */4171 if (((put_off+1) == queue_len ? 0 : (put_off+1)) == get_off) {4172 swstats->fifo_full_cnt++;4173 DBG_PRINT(TX_DBG,4174 "No free TxDs for xmit, Put: 0x%x Get:0x%x\n",4175 put_off, get_off);4176 s2io_stop_tx_queue(sp, fifo->fifo_no);4177 }4178 swstats->mem_allocated += skb->truesize;4179 spin_unlock_irqrestore(&fifo->tx_lock, flags);4180 4181 if (sp->config.intr_type == MSI_X)4182 tx_intr_handler(fifo);4183 4184 return NETDEV_TX_OK;4185 4186pci_map_failed:4187 swstats->pci_map_fail_cnt++;4188 s2io_stop_tx_queue(sp, fifo->fifo_no);4189 swstats->mem_freed += skb->truesize;4190 dev_kfree_skb_any(skb);4191 spin_unlock_irqrestore(&fifo->tx_lock, flags);4192 return NETDEV_TX_OK;4193}4194 4195static void4196s2io_alarm_handle(struct timer_list *t)4197{4198 struct s2io_nic *sp = from_timer(sp, t, alarm_timer);4199 struct net_device *dev = sp->dev;4200 4201 s2io_handle_errors(dev);4202 mod_timer(&sp->alarm_timer, jiffies + HZ / 2);4203}4204 4205static irqreturn_t s2io_msix_ring_handle(int irq, void *dev_id)4206{4207 struct ring_info *ring = (struct ring_info *)dev_id;4208 struct s2io_nic *sp = ring->nic;4209 struct XENA_dev_config __iomem *bar0 = sp->bar0;4210 4211 if (unlikely(!is_s2io_card_up(sp)))4212 return IRQ_HANDLED;4213 4214 if (sp->config.napi) {4215 u8 __iomem *addr = NULL;4216 u8 val8 = 0;4217 4218 addr = (u8 __iomem *)&bar0->xmsi_mask_reg;4219 addr += (7 - ring->ring_no);4220 val8 = (ring->ring_no == 0) ? 0x7f : 0xff;4221 writeb(val8, addr);4222 val8 = readb(addr);4223 napi_schedule(&ring->napi);4224 } else {4225 rx_intr_handler(ring, 0);4226 s2io_chk_rx_buffers(sp, ring);4227 }4228 4229 return IRQ_HANDLED;4230}4231 4232static irqreturn_t s2io_msix_fifo_handle(int irq, void *dev_id)4233{4234 int i;4235 struct fifo_info *fifos = (struct fifo_info *)dev_id;4236 struct s2io_nic *sp = fifos->nic;4237 struct XENA_dev_config __iomem *bar0 = sp->bar0;4238 struct config_param *config = &sp->config;4239 u64 reason;4240 4241 if (unlikely(!is_s2io_card_up(sp)))4242 return IRQ_NONE;4243 4244 reason = readq(&bar0->general_int_status);4245 if (unlikely(reason == S2IO_MINUS_ONE))4246 /* Nothing much can be done. Get out */4247 return IRQ_HANDLED;4248 4249 if (reason & (GEN_INTR_TXPIC | GEN_INTR_TXTRAFFIC)) {4250 writeq(S2IO_MINUS_ONE, &bar0->general_int_mask);4251 4252 if (reason & GEN_INTR_TXPIC)4253 s2io_txpic_intr_handle(sp);4254 4255 if (reason & GEN_INTR_TXTRAFFIC)4256 writeq(S2IO_MINUS_ONE, &bar0->tx_traffic_int);4257 4258 for (i = 0; i < config->tx_fifo_num; i++)4259 tx_intr_handler(&fifos[i]);4260 4261 writeq(sp->general_int_mask, &bar0->general_int_mask);4262 readl(&bar0->general_int_status);4263 return IRQ_HANDLED;4264 }4265 /* The interrupt was not raised by us */4266 return IRQ_NONE;4267}4268 4269static void s2io_txpic_intr_handle(struct s2io_nic *sp)4270{4271 struct XENA_dev_config __iomem *bar0 = sp->bar0;4272 u64 val64;4273 4274 val64 = readq(&bar0->pic_int_status);4275 if (val64 & PIC_INT_GPIO) {4276 val64 = readq(&bar0->gpio_int_reg);4277 if ((val64 & GPIO_INT_REG_LINK_DOWN) &&4278 (val64 & GPIO_INT_REG_LINK_UP)) {4279 /*4280 * This is unstable state so clear both up/down4281 * interrupt and adapter to re-evaluate the link state.4282 */4283 val64 |= GPIO_INT_REG_LINK_DOWN;4284 val64 |= GPIO_INT_REG_LINK_UP;4285 writeq(val64, &bar0->gpio_int_reg);4286 val64 = readq(&bar0->gpio_int_mask);4287 val64 &= ~(GPIO_INT_MASK_LINK_UP |4288 GPIO_INT_MASK_LINK_DOWN);4289 writeq(val64, &bar0->gpio_int_mask);4290 } else if (val64 & GPIO_INT_REG_LINK_UP) {4291 val64 = readq(&bar0->adapter_status);4292 /* Enable Adapter */4293 val64 = readq(&bar0->adapter_control);4294 val64 |= ADAPTER_CNTL_EN;4295 writeq(val64, &bar0->adapter_control);4296 val64 |= ADAPTER_LED_ON;4297 writeq(val64, &bar0->adapter_control);4298 if (!sp->device_enabled_once)4299 sp->device_enabled_once = 1;4300 4301 s2io_link(sp, LINK_UP);4302 /*4303 * unmask link down interrupt and mask link-up4304 * intr4305 */4306 val64 = readq(&bar0->gpio_int_mask);4307 val64 &= ~GPIO_INT_MASK_LINK_DOWN;4308 val64 |= GPIO_INT_MASK_LINK_UP;4309 writeq(val64, &bar0->gpio_int_mask);4310 4311 } else if (val64 & GPIO_INT_REG_LINK_DOWN) {4312 val64 = readq(&bar0->adapter_status);4313 s2io_link(sp, LINK_DOWN);4314 /* Link is down so unmaks link up interrupt */4315 val64 = readq(&bar0->gpio_int_mask);4316 val64 &= ~GPIO_INT_MASK_LINK_UP;4317 val64 |= GPIO_INT_MASK_LINK_DOWN;4318 writeq(val64, &bar0->gpio_int_mask);4319 4320 /* turn off LED */4321 val64 = readq(&bar0->adapter_control);4322 val64 = val64 & (~ADAPTER_LED_ON);4323 writeq(val64, &bar0->adapter_control);4324 }4325 }4326 val64 = readq(&bar0->gpio_int_mask);4327}4328 4329/**4330 * do_s2io_chk_alarm_bit - Check for alarm and incrment the counter4331 * @value: alarm bits4332 * @addr: address value4333 * @cnt: counter variable4334 * Description: Check for alarm and increment the counter4335 * Return Value:4336 * 1 - if alarm bit set4337 * 0 - if alarm bit is not set4338 */4339static int do_s2io_chk_alarm_bit(u64 value, void __iomem *addr,4340 unsigned long long *cnt)4341{4342 u64 val64;4343 val64 = readq(addr);4344 if (val64 & value) {4345 writeq(val64, addr);4346 (*cnt)++;4347 return 1;4348 }4349 return 0;4350 4351}4352 4353/**4354 * s2io_handle_errors - Xframe error indication handler4355 * @dev_id: opaque handle to dev4356 * Description: Handle alarms such as loss of link, single or4357 * double ECC errors, critical and serious errors.4358 * Return Value:4359 * NONE4360 */4361static void s2io_handle_errors(void *dev_id)4362{4363 struct net_device *dev = (struct net_device *)dev_id;4364 struct s2io_nic *sp = netdev_priv(dev);4365 struct XENA_dev_config __iomem *bar0 = sp->bar0;4366 u64 temp64 = 0, val64 = 0;4367 int i = 0;4368 4369 struct swStat *sw_stat = &sp->mac_control.stats_info->sw_stat;4370 struct xpakStat *stats = &sp->mac_control.stats_info->xpak_stat;4371 4372 if (!is_s2io_card_up(sp))4373 return;4374 4375 if (pci_channel_offline(sp->pdev))4376 return;4377 4378 memset(&sw_stat->ring_full_cnt, 0,4379 sizeof(sw_stat->ring_full_cnt));4380 4381 /* Handling the XPAK counters update */4382 if (stats->xpak_timer_count < 72000) {4383 /* waiting for an hour */4384 stats->xpak_timer_count++;4385 } else {4386 s2io_updt_xpak_counter(dev);4387 /* reset the count to zero */4388 stats->xpak_timer_count = 0;4389 }4390 4391 /* Handling link status change error Intr */4392 if (s2io_link_fault_indication(sp) == MAC_RMAC_ERR_TIMER) {4393 val64 = readq(&bar0->mac_rmac_err_reg);4394 writeq(val64, &bar0->mac_rmac_err_reg);4395 if (val64 & RMAC_LINK_STATE_CHANGE_INT)4396 schedule_work(&sp->set_link_task);4397 }4398 4399 /* In case of a serious error, the device will be Reset. */4400 if (do_s2io_chk_alarm_bit(SERR_SOURCE_ANY, &bar0->serr_source,4401 &sw_stat->serious_err_cnt))4402 goto reset;4403 4404 /* Check for data parity error */4405 if (do_s2io_chk_alarm_bit(GPIO_INT_REG_DP_ERR_INT, &bar0->gpio_int_reg,4406 &sw_stat->parity_err_cnt))4407 goto reset;4408 4409 /* Check for ring full counter */4410 if (sp->device_type == XFRAME_II_DEVICE) {4411 val64 = readq(&bar0->ring_bump_counter1);4412 for (i = 0; i < 4; i++) {4413 temp64 = (val64 & vBIT(0xFFFF, (i*16), 16));4414 temp64 >>= 64 - ((i+1)*16);4415 sw_stat->ring_full_cnt[i] += temp64;4416 }4417 4418 val64 = readq(&bar0->ring_bump_counter2);4419 for (i = 0; i < 4; i++) {4420 temp64 = (val64 & vBIT(0xFFFF, (i*16), 16));4421 temp64 >>= 64 - ((i+1)*16);4422 sw_stat->ring_full_cnt[i+4] += temp64;4423 }4424 }4425 4426 val64 = readq(&bar0->txdma_int_status);4427 /*check for pfc_err*/4428 if (val64 & TXDMA_PFC_INT) {4429 if (do_s2io_chk_alarm_bit(PFC_ECC_DB_ERR | PFC_SM_ERR_ALARM |4430 PFC_MISC_0_ERR | PFC_MISC_1_ERR |4431 PFC_PCIX_ERR,4432 &bar0->pfc_err_reg,4433 &sw_stat->pfc_err_cnt))4434 goto reset;4435 do_s2io_chk_alarm_bit(PFC_ECC_SG_ERR,4436 &bar0->pfc_err_reg,4437 &sw_stat->pfc_err_cnt);4438 }4439 4440 /*check for tda_err*/4441 if (val64 & TXDMA_TDA_INT) {4442 if (do_s2io_chk_alarm_bit(TDA_Fn_ECC_DB_ERR |4443 TDA_SM0_ERR_ALARM |4444 TDA_SM1_ERR_ALARM,4445 &bar0->tda_err_reg,4446 &sw_stat->tda_err_cnt))4447 goto reset;4448 do_s2io_chk_alarm_bit(TDA_Fn_ECC_SG_ERR | TDA_PCIX_ERR,4449 &bar0->tda_err_reg,4450 &sw_stat->tda_err_cnt);4451 }4452 /*check for pcc_err*/4453 if (val64 & TXDMA_PCC_INT) {4454 if (do_s2io_chk_alarm_bit(PCC_SM_ERR_ALARM | PCC_WR_ERR_ALARM |4455 PCC_N_SERR | PCC_6_COF_OV_ERR |4456 PCC_7_COF_OV_ERR | PCC_6_LSO_OV_ERR |4457 PCC_7_LSO_OV_ERR | PCC_FB_ECC_DB_ERR |4458 PCC_TXB_ECC_DB_ERR,4459 &bar0->pcc_err_reg,4460 &sw_stat->pcc_err_cnt))4461 goto reset;4462 do_s2io_chk_alarm_bit(PCC_FB_ECC_SG_ERR | PCC_TXB_ECC_SG_ERR,4463 &bar0->pcc_err_reg,4464 &sw_stat->pcc_err_cnt);4465 }4466 4467 /*check for tti_err*/4468 if (val64 & TXDMA_TTI_INT) {4469 if (do_s2io_chk_alarm_bit(TTI_SM_ERR_ALARM,4470 &bar0->tti_err_reg,4471 &sw_stat->tti_err_cnt))4472 goto reset;4473 do_s2io_chk_alarm_bit(TTI_ECC_SG_ERR | TTI_ECC_DB_ERR,4474 &bar0->tti_err_reg,4475 &sw_stat->tti_err_cnt);4476 }4477 4478 /*check for lso_err*/4479 if (val64 & TXDMA_LSO_INT) {4480 if (do_s2io_chk_alarm_bit(LSO6_ABORT | LSO7_ABORT |4481 LSO6_SM_ERR_ALARM | LSO7_SM_ERR_ALARM,4482 &bar0->lso_err_reg,4483 &sw_stat->lso_err_cnt))4484 goto reset;4485 do_s2io_chk_alarm_bit(LSO6_SEND_OFLOW | LSO7_SEND_OFLOW,4486 &bar0->lso_err_reg,4487 &sw_stat->lso_err_cnt);4488 }4489 4490 /*check for tpa_err*/4491 if (val64 & TXDMA_TPA_INT) {4492 if (do_s2io_chk_alarm_bit(TPA_SM_ERR_ALARM,4493 &bar0->tpa_err_reg,4494 &sw_stat->tpa_err_cnt))4495 goto reset;4496 do_s2io_chk_alarm_bit(TPA_TX_FRM_DROP,4497 &bar0->tpa_err_reg,4498 &sw_stat->tpa_err_cnt);4499 }4500 4501 /*check for sm_err*/4502 if (val64 & TXDMA_SM_INT) {4503 if (do_s2io_chk_alarm_bit(SM_SM_ERR_ALARM,4504 &bar0->sm_err_reg,4505 &sw_stat->sm_err_cnt))4506 goto reset;4507 }4508 4509 val64 = readq(&bar0->mac_int_status);4510 if (val64 & MAC_INT_STATUS_TMAC_INT) {4511 if (do_s2io_chk_alarm_bit(TMAC_TX_BUF_OVRN | TMAC_TX_SM_ERR,4512 &bar0->mac_tmac_err_reg,4513 &sw_stat->mac_tmac_err_cnt))4514 goto reset;4515 do_s2io_chk_alarm_bit(TMAC_ECC_SG_ERR | TMAC_ECC_DB_ERR |4516 TMAC_DESC_ECC_SG_ERR |4517 TMAC_DESC_ECC_DB_ERR,4518 &bar0->mac_tmac_err_reg,4519 &sw_stat->mac_tmac_err_cnt);4520 }4521 4522 val64 = readq(&bar0->xgxs_int_status);4523 if (val64 & XGXS_INT_STATUS_TXGXS) {4524 if (do_s2io_chk_alarm_bit(TXGXS_ESTORE_UFLOW | TXGXS_TX_SM_ERR,4525 &bar0->xgxs_txgxs_err_reg,4526 &sw_stat->xgxs_txgxs_err_cnt))4527 goto reset;4528 do_s2io_chk_alarm_bit(TXGXS_ECC_SG_ERR | TXGXS_ECC_DB_ERR,4529 &bar0->xgxs_txgxs_err_reg,4530 &sw_stat->xgxs_txgxs_err_cnt);4531 }4532 4533 val64 = readq(&bar0->rxdma_int_status);4534 if (val64 & RXDMA_INT_RC_INT_M) {4535 if (do_s2io_chk_alarm_bit(RC_PRCn_ECC_DB_ERR |4536 RC_FTC_ECC_DB_ERR |4537 RC_PRCn_SM_ERR_ALARM |4538 RC_FTC_SM_ERR_ALARM,4539 &bar0->rc_err_reg,4540 &sw_stat->rc_err_cnt))4541 goto reset;4542 do_s2io_chk_alarm_bit(RC_PRCn_ECC_SG_ERR |4543 RC_FTC_ECC_SG_ERR |4544 RC_RDA_FAIL_WR_Rn, &bar0->rc_err_reg,4545 &sw_stat->rc_err_cnt);4546 if (do_s2io_chk_alarm_bit(PRC_PCI_AB_RD_Rn |4547 PRC_PCI_AB_WR_Rn |4548 PRC_PCI_AB_F_WR_Rn,4549 &bar0->prc_pcix_err_reg,4550 &sw_stat->prc_pcix_err_cnt))4551 goto reset;4552 do_s2io_chk_alarm_bit(PRC_PCI_DP_RD_Rn |4553 PRC_PCI_DP_WR_Rn |4554 PRC_PCI_DP_F_WR_Rn,4555 &bar0->prc_pcix_err_reg,4556 &sw_stat->prc_pcix_err_cnt);4557 }4558 4559 if (val64 & RXDMA_INT_RPA_INT_M) {4560 if (do_s2io_chk_alarm_bit(RPA_SM_ERR_ALARM | RPA_CREDIT_ERR,4561 &bar0->rpa_err_reg,4562 &sw_stat->rpa_err_cnt))4563 goto reset;4564 do_s2io_chk_alarm_bit(RPA_ECC_SG_ERR | RPA_ECC_DB_ERR,4565 &bar0->rpa_err_reg,4566 &sw_stat->rpa_err_cnt);4567 }4568 4569 if (val64 & RXDMA_INT_RDA_INT_M) {4570 if (do_s2io_chk_alarm_bit(RDA_RXDn_ECC_DB_ERR |4571 RDA_FRM_ECC_DB_N_AERR |4572 RDA_SM1_ERR_ALARM |4573 RDA_SM0_ERR_ALARM |4574 RDA_RXD_ECC_DB_SERR,4575 &bar0->rda_err_reg,4576 &sw_stat->rda_err_cnt))4577 goto reset;4578 do_s2io_chk_alarm_bit(RDA_RXDn_ECC_SG_ERR |4579 RDA_FRM_ECC_SG_ERR |4580 RDA_MISC_ERR |4581 RDA_PCIX_ERR,4582 &bar0->rda_err_reg,4583 &sw_stat->rda_err_cnt);4584 }4585 4586 if (val64 & RXDMA_INT_RTI_INT_M) {4587 if (do_s2io_chk_alarm_bit(RTI_SM_ERR_ALARM,4588 &bar0->rti_err_reg,4589 &sw_stat->rti_err_cnt))4590 goto reset;4591 do_s2io_chk_alarm_bit(RTI_ECC_SG_ERR | RTI_ECC_DB_ERR,4592 &bar0->rti_err_reg,4593 &sw_stat->rti_err_cnt);4594 }4595 4596 val64 = readq(&bar0->mac_int_status);4597 if (val64 & MAC_INT_STATUS_RMAC_INT) {4598 if (do_s2io_chk_alarm_bit(RMAC_RX_BUFF_OVRN | RMAC_RX_SM_ERR,4599 &bar0->mac_rmac_err_reg,4600 &sw_stat->mac_rmac_err_cnt))4601 goto reset;4602 do_s2io_chk_alarm_bit(RMAC_UNUSED_INT |4603 RMAC_SINGLE_ECC_ERR |4604 RMAC_DOUBLE_ECC_ERR,4605 &bar0->mac_rmac_err_reg,4606 &sw_stat->mac_rmac_err_cnt);4607 }4608 4609 val64 = readq(&bar0->xgxs_int_status);4610 if (val64 & XGXS_INT_STATUS_RXGXS) {4611 if (do_s2io_chk_alarm_bit(RXGXS_ESTORE_OFLOW | RXGXS_RX_SM_ERR,4612 &bar0->xgxs_rxgxs_err_reg,4613 &sw_stat->xgxs_rxgxs_err_cnt))4614 goto reset;4615 }4616 4617 val64 = readq(&bar0->mc_int_status);4618 if (val64 & MC_INT_STATUS_MC_INT) {4619 if (do_s2io_chk_alarm_bit(MC_ERR_REG_SM_ERR,4620 &bar0->mc_err_reg,4621 &sw_stat->mc_err_cnt))4622 goto reset;4623 4624 /* Handling Ecc errors */4625 if (val64 & (MC_ERR_REG_ECC_ALL_SNG | MC_ERR_REG_ECC_ALL_DBL)) {4626 writeq(val64, &bar0->mc_err_reg);4627 if (val64 & MC_ERR_REG_ECC_ALL_DBL) {4628 sw_stat->double_ecc_errs++;4629 if (sp->device_type != XFRAME_II_DEVICE) {4630 /*4631 * Reset XframeI only if critical error4632 */4633 if (val64 &4634 (MC_ERR_REG_MIRI_ECC_DB_ERR_0 |4635 MC_ERR_REG_MIRI_ECC_DB_ERR_1))4636 goto reset;4637 }4638 } else4639 sw_stat->single_ecc_errs++;4640 }4641 }4642 return;4643 4644reset:4645 s2io_stop_all_tx_queue(sp);4646 schedule_work(&sp->rst_timer_task);4647 sw_stat->soft_reset_cnt++;4648}4649 4650/**4651 * s2io_isr - ISR handler of the device .4652 * @irq: the irq of the device.4653 * @dev_id: a void pointer to the dev structure of the NIC.4654 * Description: This function is the ISR handler of the device. It4655 * identifies the reason for the interrupt and calls the relevant4656 * service routines. As a contongency measure, this ISR allocates the4657 * recv buffers, if their numbers are below the panic value which is4658 * presently set to 25% of the original number of rcv buffers allocated.4659 * Return value:4660 * IRQ_HANDLED: will be returned if IRQ was handled by this routine4661 * IRQ_NONE: will be returned if interrupt is not from our device4662 */4663static irqreturn_t s2io_isr(int irq, void *dev_id)4664{4665 struct net_device *dev = (struct net_device *)dev_id;4666 struct s2io_nic *sp = netdev_priv(dev);4667 struct XENA_dev_config __iomem *bar0 = sp->bar0;4668 int i;4669 u64 reason = 0;4670 struct mac_info *mac_control;4671 struct config_param *config;4672 4673 /* Pretend we handled any irq's from a disconnected card */4674 if (pci_channel_offline(sp->pdev))4675 return IRQ_NONE;4676 4677 if (!is_s2io_card_up(sp))4678 return IRQ_NONE;4679 4680 config = &sp->config;4681 mac_control = &sp->mac_control;4682 4683 /*4684 * Identify the cause for interrupt and call the appropriate4685 * interrupt handler. Causes for the interrupt could be;4686 * 1. Rx of packet.4687 * 2. Tx complete.4688 * 3. Link down.4689 */4690 reason = readq(&bar0->general_int_status);4691 4692 if (unlikely(reason == S2IO_MINUS_ONE))4693 return IRQ_HANDLED; /* Nothing much can be done. Get out */4694 4695 if (reason &4696 (GEN_INTR_RXTRAFFIC | GEN_INTR_TXTRAFFIC | GEN_INTR_TXPIC)) {4697 writeq(S2IO_MINUS_ONE, &bar0->general_int_mask);4698 4699 if (config->napi) {4700 if (reason & GEN_INTR_RXTRAFFIC) {4701 napi_schedule(&sp->napi);4702 writeq(S2IO_MINUS_ONE, &bar0->rx_traffic_mask);4703 writeq(S2IO_MINUS_ONE, &bar0->rx_traffic_int);4704 readl(&bar0->rx_traffic_int);4705 }4706 } else {4707 /*4708 * rx_traffic_int reg is an R1 register, writing all 1's4709 * will ensure that the actual interrupt causing bit4710 * get's cleared and hence a read can be avoided.4711 */4712 if (reason & GEN_INTR_RXTRAFFIC)4713 writeq(S2IO_MINUS_ONE, &bar0->rx_traffic_int);4714 4715 for (i = 0; i < config->rx_ring_num; i++) {4716 struct ring_info *ring = &mac_control->rings[i];4717 4718 rx_intr_handler(ring, 0);4719 }4720 }4721 4722 /*4723 * tx_traffic_int reg is an R1 register, writing all 1's4724 * will ensure that the actual interrupt causing bit get's4725 * cleared and hence a read can be avoided.4726 */4727 if (reason & GEN_INTR_TXTRAFFIC)4728 writeq(S2IO_MINUS_ONE, &bar0->tx_traffic_int);4729 4730 for (i = 0; i < config->tx_fifo_num; i++)4731 tx_intr_handler(&mac_control->fifos[i]);4732 4733 if (reason & GEN_INTR_TXPIC)4734 s2io_txpic_intr_handle(sp);4735 4736 /*4737 * Reallocate the buffers from the interrupt handler itself.4738 */4739 if (!config->napi) {4740 for (i = 0; i < config->rx_ring_num; i++) {4741 struct ring_info *ring = &mac_control->rings[i];4742 4743 s2io_chk_rx_buffers(sp, ring);4744 }4745 }4746 writeq(sp->general_int_mask, &bar0->general_int_mask);4747 readl(&bar0->general_int_status);4748 4749 return IRQ_HANDLED;4750 4751 } else if (!reason) {4752 /* The interrupt was not raised by us */4753 return IRQ_NONE;4754 }4755 4756 return IRQ_HANDLED;4757}4758 4759/*4760 * s2io_updt_stats -4761 */4762static void s2io_updt_stats(struct s2io_nic *sp)4763{4764 struct XENA_dev_config __iomem *bar0 = sp->bar0;4765 u64 val64;4766 int cnt = 0;4767 4768 if (is_s2io_card_up(sp)) {4769 /* Apprx 30us on a 133 MHz bus */4770 val64 = SET_UPDT_CLICKS(10) |4771 STAT_CFG_ONE_SHOT_EN | STAT_CFG_STAT_EN;4772 writeq(val64, &bar0->stat_cfg);4773 do {4774 udelay(100);4775 val64 = readq(&bar0->stat_cfg);4776 if (!(val64 & s2BIT(0)))4777 break;4778 cnt++;4779 if (cnt == 5)4780 break; /* Updt failed */4781 } while (1);4782 }4783}4784 4785/**4786 * s2io_get_stats - Updates the device statistics structure.4787 * @dev : pointer to the device structure.4788 * Description:4789 * This function updates the device statistics structure in the s2io_nic4790 * structure and returns a pointer to the same.4791 * Return value:4792 * pointer to the updated net_device_stats structure.4793 */4794static struct net_device_stats *s2io_get_stats(struct net_device *dev)4795{4796 struct s2io_nic *sp = netdev_priv(dev);4797 struct mac_info *mac_control = &sp->mac_control;4798 struct stat_block *stats = mac_control->stats_info;4799 u64 delta;4800 4801 /* Configure Stats for immediate updt */4802 s2io_updt_stats(sp);4803 4804 /* A device reset will cause the on-adapter statistics to be zero'ed.4805 * This can be done while running by changing the MTU. To prevent the4806 * system from having the stats zero'ed, the driver keeps a copy of the4807 * last update to the system (which is also zero'ed on reset). This4808 * enables the driver to accurately know the delta between the last4809 * update and the current update.4810 */4811 delta = ((u64) le32_to_cpu(stats->rmac_vld_frms_oflow) << 32 |4812 le32_to_cpu(stats->rmac_vld_frms)) - sp->stats.rx_packets;4813 sp->stats.rx_packets += delta;4814 dev->stats.rx_packets += delta;4815 4816 delta = ((u64) le32_to_cpu(stats->tmac_frms_oflow) << 32 |4817 le32_to_cpu(stats->tmac_frms)) - sp->stats.tx_packets;4818 sp->stats.tx_packets += delta;4819 dev->stats.tx_packets += delta;4820 4821 delta = ((u64) le32_to_cpu(stats->rmac_data_octets_oflow) << 32 |4822 le32_to_cpu(stats->rmac_data_octets)) - sp->stats.rx_bytes;4823 sp->stats.rx_bytes += delta;4824 dev->stats.rx_bytes += delta;4825 4826 delta = ((u64) le32_to_cpu(stats->tmac_data_octets_oflow) << 32 |4827 le32_to_cpu(stats->tmac_data_octets)) - sp->stats.tx_bytes;4828 sp->stats.tx_bytes += delta;4829 dev->stats.tx_bytes += delta;4830 4831 delta = le64_to_cpu(stats->rmac_drop_frms) - sp->stats.rx_errors;4832 sp->stats.rx_errors += delta;4833 dev->stats.rx_errors += delta;4834 4835 delta = ((u64) le32_to_cpu(stats->tmac_any_err_frms_oflow) << 32 |4836 le32_to_cpu(stats->tmac_any_err_frms)) - sp->stats.tx_errors;4837 sp->stats.tx_errors += delta;4838 dev->stats.tx_errors += delta;4839 4840 delta = le64_to_cpu(stats->rmac_drop_frms) - sp->stats.rx_dropped;4841 sp->stats.rx_dropped += delta;4842 dev->stats.rx_dropped += delta;4843 4844 delta = le64_to_cpu(stats->tmac_drop_frms) - sp->stats.tx_dropped;4845 sp->stats.tx_dropped += delta;4846 dev->stats.tx_dropped += delta;4847 4848 /* The adapter MAC interprets pause frames as multicast packets, but4849 * does not pass them up. This erroneously increases the multicast4850 * packet count and needs to be deducted when the multicast frame count4851 * is queried.4852 */4853 delta = (u64) le32_to_cpu(stats->rmac_vld_mcst_frms_oflow) << 32 |4854 le32_to_cpu(stats->rmac_vld_mcst_frms);4855 delta -= le64_to_cpu(stats->rmac_pause_ctrl_frms);4856 delta -= sp->stats.multicast;4857 sp->stats.multicast += delta;4858 dev->stats.multicast += delta;4859 4860 delta = ((u64) le32_to_cpu(stats->rmac_usized_frms_oflow) << 32 |4861 le32_to_cpu(stats->rmac_usized_frms)) +4862 le64_to_cpu(stats->rmac_long_frms) - sp->stats.rx_length_errors;4863 sp->stats.rx_length_errors += delta;4864 dev->stats.rx_length_errors += delta;4865 4866 delta = le64_to_cpu(stats->rmac_fcs_err_frms) - sp->stats.rx_crc_errors;4867 sp->stats.rx_crc_errors += delta;4868 dev->stats.rx_crc_errors += delta;4869 4870 return &dev->stats;4871}4872 4873/**4874 * s2io_set_multicast - entry point for multicast address enable/disable.4875 * @dev : pointer to the device structure4876 * @may_sleep: parameter indicates if sleeping when waiting for command4877 * complete4878 * Description:4879 * This function is a driver entry point which gets called by the kernel4880 * whenever multicast addresses must be enabled/disabled. This also gets4881 * called to set/reset promiscuous mode. Depending on the deivce flag, we4882 * determine, if multicast address must be enabled or if promiscuous mode4883 * is to be disabled etc.4884 * Return value:4885 * void.4886 */4887static void s2io_set_multicast(struct net_device *dev, bool may_sleep)4888{4889 int i, j, prev_cnt;4890 struct netdev_hw_addr *ha;4891 struct s2io_nic *sp = netdev_priv(dev);4892 struct XENA_dev_config __iomem *bar0 = sp->bar0;4893 u64 val64 = 0, multi_mac = 0x010203040506ULL, mask =4894 0xfeffffffffffULL;4895 u64 dis_addr = S2IO_DISABLE_MAC_ENTRY, mac_addr = 0;4896 void __iomem *add;4897 struct config_param *config = &sp->config;4898 4899 if ((dev->flags & IFF_ALLMULTI) && (!sp->m_cast_flg)) {4900 /* Enable all Multicast addresses */4901 writeq(RMAC_ADDR_DATA0_MEM_ADDR(multi_mac),4902 &bar0->rmac_addr_data0_mem);4903 writeq(RMAC_ADDR_DATA1_MEM_MASK(mask),4904 &bar0->rmac_addr_data1_mem);4905 val64 = RMAC_ADDR_CMD_MEM_WE |4906 RMAC_ADDR_CMD_MEM_STROBE_NEW_CMD |4907 RMAC_ADDR_CMD_MEM_OFFSET(config->max_mc_addr - 1);4908 writeq(val64, &bar0->rmac_addr_cmd_mem);4909 /* Wait till command completes */4910 wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem,4911 RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING,4912 S2IO_BIT_RESET, may_sleep);4913 4914 sp->m_cast_flg = 1;4915 sp->all_multi_pos = config->max_mc_addr - 1;4916 } else if ((dev->flags & IFF_ALLMULTI) && (sp->m_cast_flg)) {4917 /* Disable all Multicast addresses */4918 writeq(RMAC_ADDR_DATA0_MEM_ADDR(dis_addr),4919 &bar0->rmac_addr_data0_mem);4920 writeq(RMAC_ADDR_DATA1_MEM_MASK(0x0),4921 &bar0->rmac_addr_data1_mem);4922 val64 = RMAC_ADDR_CMD_MEM_WE |4923 RMAC_ADDR_CMD_MEM_STROBE_NEW_CMD |4924 RMAC_ADDR_CMD_MEM_OFFSET(sp->all_multi_pos);4925 writeq(val64, &bar0->rmac_addr_cmd_mem);4926 /* Wait till command completes */4927 wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem,4928 RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING,4929 S2IO_BIT_RESET, may_sleep);4930 4931 sp->m_cast_flg = 0;4932 sp->all_multi_pos = 0;4933 }4934 4935 if ((dev->flags & IFF_PROMISC) && (!sp->promisc_flg)) {4936 /* Put the NIC into promiscuous mode */4937 add = &bar0->mac_cfg;4938 val64 = readq(&bar0->mac_cfg);4939 val64 |= MAC_CFG_RMAC_PROM_ENABLE;4940 4941 writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key);4942 writel((u32)val64, add);4943 writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key);4944 writel((u32) (val64 >> 32), (add + 4));4945 4946 if (vlan_tag_strip != 1) {4947 val64 = readq(&bar0->rx_pa_cfg);4948 val64 &= ~RX_PA_CFG_STRIP_VLAN_TAG;4949 writeq(val64, &bar0->rx_pa_cfg);4950 sp->vlan_strip_flag = 0;4951 }4952 4953 val64 = readq(&bar0->mac_cfg);4954 sp->promisc_flg = 1;4955 DBG_PRINT(INFO_DBG, "%s: entered promiscuous mode\n",4956 dev->name);4957 } else if (!(dev->flags & IFF_PROMISC) && (sp->promisc_flg)) {4958 /* Remove the NIC from promiscuous mode */4959 add = &bar0->mac_cfg;4960 val64 = readq(&bar0->mac_cfg);4961 val64 &= ~MAC_CFG_RMAC_PROM_ENABLE;4962 4963 writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key);4964 writel((u32)val64, add);4965 writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key);4966 writel((u32) (val64 >> 32), (add + 4));4967 4968 if (vlan_tag_strip != 0) {4969 val64 = readq(&bar0->rx_pa_cfg);4970 val64 |= RX_PA_CFG_STRIP_VLAN_TAG;4971 writeq(val64, &bar0->rx_pa_cfg);4972 sp->vlan_strip_flag = 1;4973 }4974 4975 val64 = readq(&bar0->mac_cfg);4976 sp->promisc_flg = 0;4977 DBG_PRINT(INFO_DBG, "%s: left promiscuous mode\n", dev->name);4978 }4979 4980 /* Update individual M_CAST address list */4981 if ((!sp->m_cast_flg) && netdev_mc_count(dev)) {4982 if (netdev_mc_count(dev) >4983 (config->max_mc_addr - config->max_mac_addr)) {4984 DBG_PRINT(ERR_DBG,4985 "%s: No more Rx filters can be added - "4986 "please enable ALL_MULTI instead\n",4987 dev->name);4988 return;4989 }4990 4991 prev_cnt = sp->mc_addr_count;4992 sp->mc_addr_count = netdev_mc_count(dev);4993 4994 /* Clear out the previous list of Mc in the H/W. */4995 for (i = 0; i < prev_cnt; i++) {4996 writeq(RMAC_ADDR_DATA0_MEM_ADDR(dis_addr),4997 &bar0->rmac_addr_data0_mem);4998 writeq(RMAC_ADDR_DATA1_MEM_MASK(0ULL),4999 &bar0->rmac_addr_data1_mem);5000 val64 = RMAC_ADDR_CMD_MEM_WE |5001 RMAC_ADDR_CMD_MEM_STROBE_NEW_CMD |5002 RMAC_ADDR_CMD_MEM_OFFSET5003 (config->mc_start_offset + i);5004 writeq(val64, &bar0->rmac_addr_cmd_mem);5005 5006 /* Wait for command completes */5007 if (wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem,5008 RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING,5009 S2IO_BIT_RESET, may_sleep)) {5010 DBG_PRINT(ERR_DBG,5011 "%s: Adding Multicasts failed\n",5012 dev->name);5013 return;5014 }5015 }5016 5017 /* Create the new Rx filter list and update the same in H/W. */5018 i = 0;5019 netdev_for_each_mc_addr(ha, dev) {5020 mac_addr = 0;5021 for (j = 0; j < ETH_ALEN; j++) {5022 mac_addr |= ha->addr[j];5023 mac_addr <<= 8;5024 }5025 mac_addr >>= 8;5026 writeq(RMAC_ADDR_DATA0_MEM_ADDR(mac_addr),5027 &bar0->rmac_addr_data0_mem);5028 writeq(RMAC_ADDR_DATA1_MEM_MASK(0ULL),5029 &bar0->rmac_addr_data1_mem);5030 val64 = RMAC_ADDR_CMD_MEM_WE |5031 RMAC_ADDR_CMD_MEM_STROBE_NEW_CMD |5032 RMAC_ADDR_CMD_MEM_OFFSET5033 (i + config->mc_start_offset);5034 writeq(val64, &bar0->rmac_addr_cmd_mem);5035 5036 /* Wait for command completes */5037 if (wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem,5038 RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING,5039 S2IO_BIT_RESET, may_sleep)) {5040 DBG_PRINT(ERR_DBG,5041 "%s: Adding Multicasts failed\n",5042 dev->name);5043 return;5044 }5045 i++;5046 }5047 }5048}5049 5050/* NDO wrapper for s2io_set_multicast */5051static void s2io_ndo_set_multicast(struct net_device *dev)5052{5053 s2io_set_multicast(dev, false);5054}5055 5056/* read from CAM unicast & multicast addresses and store it in5057 * def_mac_addr structure5058 */5059static void do_s2io_store_unicast_mc(struct s2io_nic *sp)5060{5061 int offset;5062 u64 mac_addr = 0x0;5063 struct config_param *config = &sp->config;5064 5065 /* store unicast & multicast mac addresses */5066 for (offset = 0; offset < config->max_mc_addr; offset++) {5067 mac_addr = do_s2io_read_unicast_mc(sp, offset);5068 /* if read fails disable the entry */5069 if (mac_addr == FAILURE)5070 mac_addr = S2IO_DISABLE_MAC_ENTRY;5071 do_s2io_copy_mac_addr(sp, offset, mac_addr);5072 }5073}5074 5075/* restore unicast & multicast MAC to CAM from def_mac_addr structure */5076static void do_s2io_restore_unicast_mc(struct s2io_nic *sp)5077{5078 int offset;5079 struct config_param *config = &sp->config;5080 /* restore unicast mac address */5081 for (offset = 0; offset < config->max_mac_addr; offset++)5082 do_s2io_prog_unicast(sp->dev,5083 sp->def_mac_addr[offset].mac_addr);5084 5085 /* restore multicast mac address */5086 for (offset = config->mc_start_offset;5087 offset < config->max_mc_addr; offset++)5088 do_s2io_add_mc(sp, sp->def_mac_addr[offset].mac_addr);5089}5090 5091/* add a multicast MAC address to CAM */5092static int do_s2io_add_mc(struct s2io_nic *sp, u8 *addr)5093{5094 int i;5095 u64 mac_addr;5096 struct config_param *config = &sp->config;5097 5098 mac_addr = ether_addr_to_u64(addr);5099 if ((0ULL == mac_addr) || (mac_addr == S2IO_DISABLE_MAC_ENTRY))5100 return SUCCESS;5101 5102 /* check if the multicast mac already preset in CAM */5103 for (i = config->mc_start_offset; i < config->max_mc_addr; i++) {5104 u64 tmp64;5105 tmp64 = do_s2io_read_unicast_mc(sp, i);5106 if (tmp64 == S2IO_DISABLE_MAC_ENTRY) /* CAM entry is empty */5107 break;5108 5109 if (tmp64 == mac_addr)5110 return SUCCESS;5111 }5112 if (i == config->max_mc_addr) {5113 DBG_PRINT(ERR_DBG,5114 "CAM full no space left for multicast MAC\n");5115 return FAILURE;5116 }5117 /* Update the internal structure with this new mac address */5118 do_s2io_copy_mac_addr(sp, i, mac_addr);5119 5120 return do_s2io_add_mac(sp, mac_addr, i);5121}5122 5123/* add MAC address to CAM */5124static int do_s2io_add_mac(struct s2io_nic *sp, u64 addr, int off)5125{5126 u64 val64;5127 struct XENA_dev_config __iomem *bar0 = sp->bar0;5128 5129 writeq(RMAC_ADDR_DATA0_MEM_ADDR(addr),5130 &bar0->rmac_addr_data0_mem);5131 5132 val64 = RMAC_ADDR_CMD_MEM_WE | RMAC_ADDR_CMD_MEM_STROBE_NEW_CMD |5133 RMAC_ADDR_CMD_MEM_OFFSET(off);5134 writeq(val64, &bar0->rmac_addr_cmd_mem);5135 5136 /* Wait till command completes */5137 if (wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem,5138 RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING,5139 S2IO_BIT_RESET, true)) {5140 DBG_PRINT(INFO_DBG, "do_s2io_add_mac failed\n");5141 return FAILURE;5142 }5143 return SUCCESS;5144}5145/* deletes a specified unicast/multicast mac entry from CAM */5146static int do_s2io_delete_unicast_mc(struct s2io_nic *sp, u64 addr)5147{5148 int offset;5149 u64 dis_addr = S2IO_DISABLE_MAC_ENTRY, tmp64;5150 struct config_param *config = &sp->config;5151 5152 for (offset = 1;5153 offset < config->max_mc_addr; offset++) {5154 tmp64 = do_s2io_read_unicast_mc(sp, offset);5155 if (tmp64 == addr) {5156 /* disable the entry by writing 0xffffffffffffULL */5157 if (do_s2io_add_mac(sp, dis_addr, offset) == FAILURE)5158 return FAILURE;5159 /* store the new mac list from CAM */5160 do_s2io_store_unicast_mc(sp);5161 return SUCCESS;5162 }5163 }5164 DBG_PRINT(ERR_DBG, "MAC address 0x%llx not found in CAM\n",5165 (unsigned long long)addr);5166 return FAILURE;5167}5168 5169/* read mac entries from CAM */5170static u64 do_s2io_read_unicast_mc(struct s2io_nic *sp, int offset)5171{5172 u64 tmp64, val64;5173 struct XENA_dev_config __iomem *bar0 = sp->bar0;5174 5175 /* read mac addr */5176 val64 = RMAC_ADDR_CMD_MEM_RD | RMAC_ADDR_CMD_MEM_STROBE_NEW_CMD |5177 RMAC_ADDR_CMD_MEM_OFFSET(offset);5178 writeq(val64, &bar0->rmac_addr_cmd_mem);5179 5180 /* Wait till command completes */5181 if (wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem,5182 RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING,5183 S2IO_BIT_RESET, true)) {5184 DBG_PRINT(INFO_DBG, "do_s2io_read_unicast_mc failed\n");5185 return FAILURE;5186 }5187 tmp64 = readq(&bar0->rmac_addr_data0_mem);5188 5189 return tmp64 >> 16;5190}5191 5192/*5193 * s2io_set_mac_addr - driver entry point5194 */5195 5196static int s2io_set_mac_addr(struct net_device *dev, void *p)5197{5198 struct sockaddr *addr = p;5199 5200 if (!is_valid_ether_addr(addr->sa_data))5201 return -EADDRNOTAVAIL;5202 5203 eth_hw_addr_set(dev, addr->sa_data);5204 5205 /* store the MAC address in CAM */5206 return do_s2io_prog_unicast(dev, dev->dev_addr);5207}5208/**5209 * do_s2io_prog_unicast - Programs the Xframe mac address5210 * @dev : pointer to the device structure.5211 * @addr: a uchar pointer to the new mac address which is to be set.5212 * Description : This procedure will program the Xframe to receive5213 * frames with new Mac Address5214 * Return value: SUCCESS on success and an appropriate (-)ve integer5215 * as defined in errno.h file on failure.5216 */5217 5218static int do_s2io_prog_unicast(struct net_device *dev, const u8 *addr)5219{5220 struct s2io_nic *sp = netdev_priv(dev);5221 register u64 mac_addr, perm_addr;5222 int i;5223 u64 tmp64;5224 struct config_param *config = &sp->config;5225 5226 /*5227 * Set the new MAC address as the new unicast filter and reflect this5228 * change on the device address registered with the OS. It will be5229 * at offset 0.5230 */5231 mac_addr = ether_addr_to_u64(addr);5232 perm_addr = ether_addr_to_u64(sp->def_mac_addr[0].mac_addr);5233 5234 /* check if the dev_addr is different than perm_addr */5235 if (mac_addr == perm_addr)5236 return SUCCESS;5237 5238 /* check if the mac already preset in CAM */5239 for (i = 1; i < config->max_mac_addr; i++) {5240 tmp64 = do_s2io_read_unicast_mc(sp, i);5241 if (tmp64 == S2IO_DISABLE_MAC_ENTRY) /* CAM entry is empty */5242 break;5243 5244 if (tmp64 == mac_addr) {5245 DBG_PRINT(INFO_DBG,5246 "MAC addr:0x%llx already present in CAM\n",5247 (unsigned long long)mac_addr);5248 return SUCCESS;5249 }5250 }5251 if (i == config->max_mac_addr) {5252 DBG_PRINT(ERR_DBG, "CAM full no space left for Unicast MAC\n");5253 return FAILURE;5254 }5255 /* Update the internal structure with this new mac address */5256 do_s2io_copy_mac_addr(sp, i, mac_addr);5257 5258 return do_s2io_add_mac(sp, mac_addr, i);5259}5260 5261/**5262 * s2io_ethtool_set_link_ksettings - Sets different link parameters.5263 * @dev : pointer to netdev5264 * @cmd: pointer to the structure with parameters given by ethtool to set5265 * link information.5266 * Description:5267 * The function sets different link parameters provided by the user onto5268 * the NIC.5269 * Return value:5270 * 0 on success.5271 */5272 5273static int5274s2io_ethtool_set_link_ksettings(struct net_device *dev,5275 const struct ethtool_link_ksettings *cmd)5276{5277 struct s2io_nic *sp = netdev_priv(dev);5278 if ((cmd->base.autoneg == AUTONEG_ENABLE) ||5279 (cmd->base.speed != SPEED_10000) ||5280 (cmd->base.duplex != DUPLEX_FULL))5281 return -EINVAL;5282 else {5283 s2io_close(sp->dev);5284 s2io_open(sp->dev);5285 }5286 5287 return 0;5288}5289 5290/**5291 * s2io_ethtool_get_link_ksettings - Return link specific information.5292 * @dev: pointer to netdev5293 * @cmd : pointer to the structure with parameters given by ethtool5294 * to return link information.5295 * Description:5296 * Returns link specific information like speed, duplex etc.. to ethtool.5297 * Return value :5298 * return 0 on success.5299 */5300 5301static int5302s2io_ethtool_get_link_ksettings(struct net_device *dev,5303 struct ethtool_link_ksettings *cmd)5304{5305 struct s2io_nic *sp = netdev_priv(dev);5306 5307 ethtool_link_ksettings_zero_link_mode(cmd, supported);5308 ethtool_link_ksettings_add_link_mode(cmd, supported, 10000baseT_Full);5309 ethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE);5310 5311 ethtool_link_ksettings_zero_link_mode(cmd, advertising);5312 ethtool_link_ksettings_add_link_mode(cmd, advertising, 10000baseT_Full);5313 ethtool_link_ksettings_add_link_mode(cmd, advertising, FIBRE);5314 5315 cmd->base.port = PORT_FIBRE;5316 5317 if (netif_carrier_ok(sp->dev)) {5318 cmd->base.speed = SPEED_10000;5319 cmd->base.duplex = DUPLEX_FULL;5320 } else {5321 cmd->base.speed = SPEED_UNKNOWN;5322 cmd->base.duplex = DUPLEX_UNKNOWN;5323 }5324 5325 cmd->base.autoneg = AUTONEG_DISABLE;5326 return 0;5327}5328 5329/**5330 * s2io_ethtool_gdrvinfo - Returns driver specific information.5331 * @dev: pointer to netdev5332 * @info : pointer to the structure with parameters given by ethtool to5333 * return driver information.5334 * Description:5335 * Returns driver specefic information like name, version etc.. to ethtool.5336 * Return value:5337 * void5338 */5339 5340static void s2io_ethtool_gdrvinfo(struct net_device *dev,5341 struct ethtool_drvinfo *info)5342{5343 struct s2io_nic *sp = netdev_priv(dev);5344 5345 strscpy(info->driver, s2io_driver_name, sizeof(info->driver));5346 strscpy(info->version, s2io_driver_version, sizeof(info->version));5347 strscpy(info->bus_info, pci_name(sp->pdev), sizeof(info->bus_info));5348}5349 5350/**5351 * s2io_ethtool_gregs - dumps the entire space of Xfame into the buffer.5352 * @dev: pointer to netdev5353 * @regs : pointer to the structure with parameters given by ethtool for5354 * dumping the registers.5355 * @space: The input argument into which all the registers are dumped.5356 * Description:5357 * Dumps the entire register space of xFrame NIC into the user given5358 * buffer area.5359 * Return value :5360 * void .5361 */5362 5363static void s2io_ethtool_gregs(struct net_device *dev,5364 struct ethtool_regs *regs, void *space)5365{5366 int i;5367 u64 reg;5368 u8 *reg_space = (u8 *)space;5369 struct s2io_nic *sp = netdev_priv(dev);5370 5371 regs->len = XENA_REG_SPACE;5372 regs->version = sp->pdev->subsystem_device;5373 5374 for (i = 0; i < regs->len; i += 8) {5375 reg = readq(sp->bar0 + i);5376 memcpy((reg_space + i), ®, 8);5377 }5378}5379 5380/*5381 * s2io_set_led - control NIC led5382 */5383static void s2io_set_led(struct s2io_nic *sp, bool on)5384{5385 struct XENA_dev_config __iomem *bar0 = sp->bar0;5386 u16 subid = sp->pdev->subsystem_device;5387 u64 val64;5388 5389 if ((sp->device_type == XFRAME_II_DEVICE) ||5390 ((subid & 0xFF) >= 0x07)) {5391 val64 = readq(&bar0->gpio_control);5392 if (on)5393 val64 |= GPIO_CTRL_GPIO_0;5394 else5395 val64 &= ~GPIO_CTRL_GPIO_0;5396 5397 writeq(val64, &bar0->gpio_control);5398 } else {5399 val64 = readq(&bar0->adapter_control);5400 if (on)5401 val64 |= ADAPTER_LED_ON;5402 else5403 val64 &= ~ADAPTER_LED_ON;5404 5405 writeq(val64, &bar0->adapter_control);5406 }5407 5408}5409 5410/**5411 * s2io_ethtool_set_led - To physically identify the nic on the system.5412 * @dev : network device5413 * @state: led setting5414 *5415 * Description: Used to physically identify the NIC on the system.5416 * The Link LED will blink for a time specified by the user for5417 * identification.5418 * NOTE: The Link has to be Up to be able to blink the LED. Hence5419 * identification is possible only if it's link is up.5420 */5421 5422static int s2io_ethtool_set_led(struct net_device *dev,5423 enum ethtool_phys_id_state state)5424{5425 struct s2io_nic *sp = netdev_priv(dev);5426 struct XENA_dev_config __iomem *bar0 = sp->bar0;5427 u16 subid = sp->pdev->subsystem_device;5428 5429 if ((sp->device_type == XFRAME_I_DEVICE) && ((subid & 0xFF) < 0x07)) {5430 u64 val64 = readq(&bar0->adapter_control);5431 if (!(val64 & ADAPTER_CNTL_EN)) {5432 pr_err("Adapter Link down, cannot blink LED\n");5433 return -EAGAIN;5434 }5435 }5436 5437 switch (state) {5438 case ETHTOOL_ID_ACTIVE:5439 sp->adapt_ctrl_org = readq(&bar0->gpio_control);5440 return 1; /* cycle on/off once per second */5441 5442 case ETHTOOL_ID_ON:5443 s2io_set_led(sp, true);5444 break;5445 5446 case ETHTOOL_ID_OFF:5447 s2io_set_led(sp, false);5448 break;5449 5450 case ETHTOOL_ID_INACTIVE:5451 if (CARDS_WITH_FAULTY_LINK_INDICATORS(sp->device_type, subid))5452 writeq(sp->adapt_ctrl_org, &bar0->gpio_control);5453 }5454 5455 return 0;5456}5457 5458static void5459s2io_ethtool_gringparam(struct net_device *dev,5460 struct ethtool_ringparam *ering,5461 struct kernel_ethtool_ringparam *kernel_ering,5462 struct netlink_ext_ack *extack)5463{5464 struct s2io_nic *sp = netdev_priv(dev);5465 int i, tx_desc_count = 0, rx_desc_count = 0;5466 5467 if (sp->rxd_mode == RXD_MODE_1) {5468 ering->rx_max_pending = MAX_RX_DESC_1;5469 ering->rx_jumbo_max_pending = MAX_RX_DESC_1;5470 } else {5471 ering->rx_max_pending = MAX_RX_DESC_2;5472 ering->rx_jumbo_max_pending = MAX_RX_DESC_2;5473 }5474 5475 ering->tx_max_pending = MAX_TX_DESC;5476 5477 for (i = 0; i < sp->config.rx_ring_num; i++)5478 rx_desc_count += sp->config.rx_cfg[i].num_rxd;5479 ering->rx_pending = rx_desc_count;5480 ering->rx_jumbo_pending = rx_desc_count;5481 5482 for (i = 0; i < sp->config.tx_fifo_num; i++)5483 tx_desc_count += sp->config.tx_cfg[i].fifo_len;5484 ering->tx_pending = tx_desc_count;5485 DBG_PRINT(INFO_DBG, "max txds: %d\n", sp->config.max_txds);5486}5487 5488/**5489 * s2io_ethtool_getpause_data -Pause frame generation and reception.5490 * @dev: pointer to netdev5491 * @ep : pointer to the structure with pause parameters given by ethtool.5492 * Description:5493 * Returns the Pause frame generation and reception capability of the NIC.5494 * Return value:5495 * void5496 */5497static void s2io_ethtool_getpause_data(struct net_device *dev,5498 struct ethtool_pauseparam *ep)5499{5500 u64 val64;5501 struct s2io_nic *sp = netdev_priv(dev);5502 struct XENA_dev_config __iomem *bar0 = sp->bar0;5503 5504 val64 = readq(&bar0->rmac_pause_cfg);5505 if (val64 & RMAC_PAUSE_GEN_ENABLE)5506 ep->tx_pause = true;5507 if (val64 & RMAC_PAUSE_RX_ENABLE)5508 ep->rx_pause = true;5509 ep->autoneg = false;5510}5511 5512/**5513 * s2io_ethtool_setpause_data - set/reset pause frame generation.5514 * @dev: pointer to netdev5515 * @ep : pointer to the structure with pause parameters given by ethtool.5516 * Description:5517 * It can be used to set or reset Pause frame generation or reception5518 * support of the NIC.5519 * Return value:5520 * int, returns 0 on Success5521 */5522 5523static int s2io_ethtool_setpause_data(struct net_device *dev,5524 struct ethtool_pauseparam *ep)5525{5526 u64 val64;5527 struct s2io_nic *sp = netdev_priv(dev);5528 struct XENA_dev_config __iomem *bar0 = sp->bar0;5529 5530 val64 = readq(&bar0->rmac_pause_cfg);5531 if (ep->tx_pause)5532 val64 |= RMAC_PAUSE_GEN_ENABLE;5533 else5534 val64 &= ~RMAC_PAUSE_GEN_ENABLE;5535 if (ep->rx_pause)5536 val64 |= RMAC_PAUSE_RX_ENABLE;5537 else5538 val64 &= ~RMAC_PAUSE_RX_ENABLE;5539 writeq(val64, &bar0->rmac_pause_cfg);5540 return 0;5541}5542 5543#define S2IO_DEV_ID 55544/**5545 * read_eeprom - reads 4 bytes of data from user given offset.5546 * @sp : private member of the device structure, which is a pointer to the5547 * s2io_nic structure.5548 * @off : offset at which the data must be written5549 * @data : Its an output parameter where the data read at the given5550 * offset is stored.5551 * Description:5552 * Will read 4 bytes of data from the user given offset and return the5553 * read data.5554 * NOTE: Will allow to read only part of the EEPROM visible through the5555 * I2C bus.5556 * Return value:5557 * -1 on failure and 0 on success.5558 */5559static int read_eeprom(struct s2io_nic *sp, int off, u64 *data)5560{5561 int ret = -1;5562 u32 exit_cnt = 0;5563 u64 val64;5564 struct XENA_dev_config __iomem *bar0 = sp->bar0;5565 5566 if (sp->device_type == XFRAME_I_DEVICE) {5567 val64 = I2C_CONTROL_DEV_ID(S2IO_DEV_ID) |5568 I2C_CONTROL_ADDR(off) |5569 I2C_CONTROL_BYTE_CNT(0x3) |5570 I2C_CONTROL_READ |5571 I2C_CONTROL_CNTL_START;5572 SPECIAL_REG_WRITE(val64, &bar0->i2c_control, LF);5573 5574 while (exit_cnt < 5) {5575 val64 = readq(&bar0->i2c_control);5576 if (I2C_CONTROL_CNTL_END(val64)) {5577 *data = I2C_CONTROL_GET_DATA(val64);5578 ret = 0;5579 break;5580 }5581 msleep(50);5582 exit_cnt++;5583 }5584 }5585 5586 if (sp->device_type == XFRAME_II_DEVICE) {5587 val64 = SPI_CONTROL_KEY(0x9) | SPI_CONTROL_SEL1 |5588 SPI_CONTROL_BYTECNT(0x3) |5589 SPI_CONTROL_CMD(0x3) | SPI_CONTROL_ADDR(off);5590 SPECIAL_REG_WRITE(val64, &bar0->spi_control, LF);5591 val64 |= SPI_CONTROL_REQ;5592 SPECIAL_REG_WRITE(val64, &bar0->spi_control, LF);5593 while (exit_cnt < 5) {5594 val64 = readq(&bar0->spi_control);5595 if (val64 & SPI_CONTROL_NACK) {5596 ret = 1;5597 break;5598 } else if (val64 & SPI_CONTROL_DONE) {5599 *data = readq(&bar0->spi_data);5600 *data &= 0xffffff;5601 ret = 0;5602 break;5603 }5604 msleep(50);5605 exit_cnt++;5606 }5607 }5608 return ret;5609}5610 5611/**5612 * write_eeprom - actually writes the relevant part of the data value.5613 * @sp : private member of the device structure, which is a pointer to the5614 * s2io_nic structure.5615 * @off : offset at which the data must be written5616 * @data : The data that is to be written5617 * @cnt : Number of bytes of the data that are actually to be written into5618 * the Eeprom. (max of 3)5619 * Description:5620 * Actually writes the relevant part of the data value into the Eeprom5621 * through the I2C bus.5622 * Return value:5623 * 0 on success, -1 on failure.5624 */5625 5626static int write_eeprom(struct s2io_nic *sp, int off, u64 data, int cnt)5627{5628 int exit_cnt = 0, ret = -1;5629 u64 val64;5630 struct XENA_dev_config __iomem *bar0 = sp->bar0;5631 5632 if (sp->device_type == XFRAME_I_DEVICE) {5633 val64 = I2C_CONTROL_DEV_ID(S2IO_DEV_ID) |5634 I2C_CONTROL_ADDR(off) |5635 I2C_CONTROL_BYTE_CNT(cnt) |5636 I2C_CONTROL_SET_DATA((u32)data) |5637 I2C_CONTROL_CNTL_START;5638 SPECIAL_REG_WRITE(val64, &bar0->i2c_control, LF);5639 5640 while (exit_cnt < 5) {5641 val64 = readq(&bar0->i2c_control);5642 if (I2C_CONTROL_CNTL_END(val64)) {5643 if (!(val64 & I2C_CONTROL_NACK))5644 ret = 0;5645 break;5646 }5647 msleep(50);5648 exit_cnt++;5649 }5650 }5651 5652 if (sp->device_type == XFRAME_II_DEVICE) {5653 int write_cnt = (cnt == 8) ? 0 : cnt;5654 writeq(SPI_DATA_WRITE(data, (cnt << 3)), &bar0->spi_data);5655 5656 val64 = SPI_CONTROL_KEY(0x9) | SPI_CONTROL_SEL1 |5657 SPI_CONTROL_BYTECNT(write_cnt) |5658 SPI_CONTROL_CMD(0x2) | SPI_CONTROL_ADDR(off);5659 SPECIAL_REG_WRITE(val64, &bar0->spi_control, LF);5660 val64 |= SPI_CONTROL_REQ;5661 SPECIAL_REG_WRITE(val64, &bar0->spi_control, LF);5662 while (exit_cnt < 5) {5663 val64 = readq(&bar0->spi_control);5664 if (val64 & SPI_CONTROL_NACK) {5665 ret = 1;5666 break;5667 } else if (val64 & SPI_CONTROL_DONE) {5668 ret = 0;5669 break;5670 }5671 msleep(50);5672 exit_cnt++;5673 }5674 }5675 return ret;5676}5677static void s2io_vpd_read(struct s2io_nic *nic)5678{5679 u8 *vpd_data;5680 u8 data;5681 int i = 0, cnt, len, fail = 0;5682 int vpd_addr = 0x80;5683 struct swStat *swstats = &nic->mac_control.stats_info->sw_stat;5684 5685 if (nic->device_type == XFRAME_II_DEVICE) {5686 strcpy(nic->product_name, "Xframe II 10GbE network adapter");5687 vpd_addr = 0x80;5688 } else {5689 strcpy(nic->product_name, "Xframe I 10GbE network adapter");5690 vpd_addr = 0x50;5691 }5692 strcpy(nic->serial_num, "NOT AVAILABLE");5693 5694 vpd_data = kmalloc(256, GFP_KERNEL);5695 if (!vpd_data) {5696 swstats->mem_alloc_fail_cnt++;5697 return;5698 }5699 swstats->mem_allocated += 256;5700 5701 for (i = 0; i < 256; i += 4) {5702 pci_write_config_byte(nic->pdev, (vpd_addr + 2), i);5703 pci_read_config_byte(nic->pdev, (vpd_addr + 2), &data);5704 pci_write_config_byte(nic->pdev, (vpd_addr + 3), 0);5705 for (cnt = 0; cnt < 5; cnt++) {5706 msleep(2);5707 pci_read_config_byte(nic->pdev, (vpd_addr + 3), &data);5708 if (data == 0x80)5709 break;5710 }5711 if (cnt >= 5) {5712 DBG_PRINT(ERR_DBG, "Read of VPD data failed\n");5713 fail = 1;5714 break;5715 }5716 pci_read_config_dword(nic->pdev, (vpd_addr + 4),5717 (u32 *)&vpd_data[i]);5718 }5719 5720 if (!fail) {5721 /* read serial number of adapter */5722 for (cnt = 0; cnt < 252; cnt++) {5723 if ((vpd_data[cnt] == 'S') &&5724 (vpd_data[cnt+1] == 'N')) {5725 len = vpd_data[cnt+2];5726 if (len < min(VPD_STRING_LEN, 256-cnt-2)) {5727 memcpy(nic->serial_num,5728 &vpd_data[cnt + 3],5729 len);5730 memset(nic->serial_num+len,5731 0,5732 VPD_STRING_LEN-len);5733 break;5734 }5735 }5736 }5737 }5738 5739 if ((!fail) && (vpd_data[1] < VPD_STRING_LEN)) {5740 len = vpd_data[1];5741 memcpy(nic->product_name, &vpd_data[3], len);5742 nic->product_name[len] = 0;5743 }5744 kfree(vpd_data);5745 swstats->mem_freed += 256;5746}5747 5748/**5749 * s2io_ethtool_geeprom - reads the value stored in the Eeprom.5750 * @dev: pointer to netdev5751 * @eeprom : pointer to the user level structure provided by ethtool,5752 * containing all relevant information.5753 * @data_buf : user defined value to be written into Eeprom.5754 * Description: Reads the values stored in the Eeprom at given offset5755 * for a given length. Stores these values int the input argument data5756 * buffer 'data_buf' and returns these to the caller (ethtool.)5757 * Return value:5758 * int 0 on success5759 */5760 5761static int s2io_ethtool_geeprom(struct net_device *dev,5762 struct ethtool_eeprom *eeprom, u8 * data_buf)5763{5764 u32 i, valid;5765 u64 data;5766 struct s2io_nic *sp = netdev_priv(dev);5767 5768 eeprom->magic = sp->pdev->vendor | (sp->pdev->device << 16);5769 5770 if ((eeprom->offset + eeprom->len) > (XENA_EEPROM_SPACE))5771 eeprom->len = XENA_EEPROM_SPACE - eeprom->offset;5772 5773 for (i = 0; i < eeprom->len; i += 4) {5774 if (read_eeprom(sp, (eeprom->offset + i), &data)) {5775 DBG_PRINT(ERR_DBG, "Read of EEPROM failed\n");5776 return -EFAULT;5777 }5778 valid = INV(data);5779 memcpy((data_buf + i), &valid, 4);5780 }5781 return 0;5782}5783 5784/**5785 * s2io_ethtool_seeprom - tries to write the user provided value in Eeprom5786 * @dev: pointer to netdev5787 * @eeprom : pointer to the user level structure provided by ethtool,5788 * containing all relevant information.5789 * @data_buf : user defined value to be written into Eeprom.5790 * Description:5791 * Tries to write the user provided value in the Eeprom, at the offset5792 * given by the user.5793 * Return value:5794 * 0 on success, -EFAULT on failure.5795 */5796 5797static int s2io_ethtool_seeprom(struct net_device *dev,5798 struct ethtool_eeprom *eeprom,5799 u8 *data_buf)5800{5801 int len = eeprom->len, cnt = 0;5802 u64 valid = 0, data;5803 struct s2io_nic *sp = netdev_priv(dev);5804 5805 if (eeprom->magic != (sp->pdev->vendor | (sp->pdev->device << 16))) {5806 DBG_PRINT(ERR_DBG,5807 "ETHTOOL_WRITE_EEPROM Err: "5808 "Magic value is wrong, it is 0x%x should be 0x%x\n",5809 (sp->pdev->vendor | (sp->pdev->device << 16)),5810 eeprom->magic);5811 return -EFAULT;5812 }5813 5814 while (len) {5815 data = (u32)data_buf[cnt] & 0x000000FF;5816 if (data)5817 valid = (u32)(data << 24);5818 else5819 valid = data;5820 5821 if (write_eeprom(sp, (eeprom->offset + cnt), valid, 0)) {5822 DBG_PRINT(ERR_DBG,5823 "ETHTOOL_WRITE_EEPROM Err: "5824 "Cannot write into the specified offset\n");5825 return -EFAULT;5826 }5827 cnt++;5828 len--;5829 }5830 5831 return 0;5832}5833 5834/**5835 * s2io_register_test - reads and writes into all clock domains.5836 * @sp : private member of the device structure, which is a pointer to the5837 * s2io_nic structure.5838 * @data : variable that returns the result of each of the test conducted b5839 * by the driver.5840 * Description:5841 * Read and write into all clock domains. The NIC has 3 clock domains,5842 * see that registers in all the three regions are accessible.5843 * Return value:5844 * 0 on success.5845 */5846 5847static int s2io_register_test(struct s2io_nic *sp, uint64_t *data)5848{5849 struct XENA_dev_config __iomem *bar0 = sp->bar0;5850 u64 val64 = 0, exp_val;5851 int fail = 0;5852 5853 val64 = readq(&bar0->pif_rd_swapper_fb);5854 if (val64 != 0x123456789abcdefULL) {5855 fail = 1;5856 DBG_PRINT(INFO_DBG, "Read Test level %d fails\n", 1);5857 }5858 5859 val64 = readq(&bar0->rmac_pause_cfg);5860 if (val64 != 0xc000ffff00000000ULL) {5861 fail = 1;5862 DBG_PRINT(INFO_DBG, "Read Test level %d fails\n", 2);5863 }5864 5865 val64 = readq(&bar0->rx_queue_cfg);5866 if (sp->device_type == XFRAME_II_DEVICE)5867 exp_val = 0x0404040404040404ULL;5868 else5869 exp_val = 0x0808080808080808ULL;5870 if (val64 != exp_val) {5871 fail = 1;5872 DBG_PRINT(INFO_DBG, "Read Test level %d fails\n", 3);5873 }5874 5875 val64 = readq(&bar0->xgxs_efifo_cfg);5876 if (val64 != 0x000000001923141EULL) {5877 fail = 1;5878 DBG_PRINT(INFO_DBG, "Read Test level %d fails\n", 4);5879 }5880 5881 val64 = 0x5A5A5A5A5A5A5A5AULL;5882 writeq(val64, &bar0->xmsi_data);5883 val64 = readq(&bar0->xmsi_data);5884 if (val64 != 0x5A5A5A5A5A5A5A5AULL) {5885 fail = 1;5886 DBG_PRINT(ERR_DBG, "Write Test level %d fails\n", 1);5887 }5888 5889 val64 = 0xA5A5A5A5A5A5A5A5ULL;5890 writeq(val64, &bar0->xmsi_data);5891 val64 = readq(&bar0->xmsi_data);5892 if (val64 != 0xA5A5A5A5A5A5A5A5ULL) {5893 fail = 1;5894 DBG_PRINT(ERR_DBG, "Write Test level %d fails\n", 2);5895 }5896 5897 *data = fail;5898 return fail;5899}5900 5901/**5902 * s2io_eeprom_test - to verify that EEprom in the xena can be programmed.5903 * @sp : private member of the device structure, which is a pointer to the5904 * s2io_nic structure.5905 * @data:variable that returns the result of each of the test conducted by5906 * the driver.5907 * Description:5908 * Verify that EEPROM in the xena can be programmed using I2C_CONTROL5909 * register.5910 * Return value:5911 * 0 on success.5912 */5913 5914static int s2io_eeprom_test(struct s2io_nic *sp, uint64_t *data)5915{5916 int fail = 0;5917 u64 ret_data, org_4F0, org_7F0;5918 u8 saved_4F0 = 0, saved_7F0 = 0;5919 struct net_device *dev = sp->dev;5920 5921 /* Test Write Error at offset 0 */5922 /* Note that SPI interface allows write access to all areas5923 * of EEPROM. Hence doing all negative testing only for Xframe I.5924 */5925 if (sp->device_type == XFRAME_I_DEVICE)5926 if (!write_eeprom(sp, 0, 0, 3))5927 fail = 1;5928 5929 /* Save current values at offsets 0x4F0 and 0x7F0 */5930 if (!read_eeprom(sp, 0x4F0, &org_4F0))5931 saved_4F0 = 1;5932 if (!read_eeprom(sp, 0x7F0, &org_7F0))5933 saved_7F0 = 1;5934 5935 /* Test Write at offset 4f0 */5936 if (write_eeprom(sp, 0x4F0, 0x012345, 3))5937 fail = 1;5938 if (read_eeprom(sp, 0x4F0, &ret_data))5939 fail = 1;5940 5941 if (ret_data != 0x012345) {5942 DBG_PRINT(ERR_DBG, "%s: eeprom test error at offset 0x4F0. "5943 "Data written %llx Data read %llx\n",5944 dev->name, (unsigned long long)0x12345,5945 (unsigned long long)ret_data);5946 fail = 1;5947 }5948 5949 /* Reset the EEPROM data go FFFF */5950 write_eeprom(sp, 0x4F0, 0xFFFFFF, 3);5951 5952 /* Test Write Request Error at offset 0x7c */5953 if (sp->device_type == XFRAME_I_DEVICE)5954 if (!write_eeprom(sp, 0x07C, 0, 3))5955 fail = 1;5956 5957 /* Test Write Request at offset 0x7f0 */5958 if (write_eeprom(sp, 0x7F0, 0x012345, 3))5959 fail = 1;5960 if (read_eeprom(sp, 0x7F0, &ret_data))5961 fail = 1;5962 5963 if (ret_data != 0x012345) {5964 DBG_PRINT(ERR_DBG, "%s: eeprom test error at offset 0x7F0. "5965 "Data written %llx Data read %llx\n",5966 dev->name, (unsigned long long)0x12345,5967 (unsigned long long)ret_data);5968 fail = 1;5969 }5970 5971 /* Reset the EEPROM data go FFFF */5972 write_eeprom(sp, 0x7F0, 0xFFFFFF, 3);5973 5974 if (sp->device_type == XFRAME_I_DEVICE) {5975 /* Test Write Error at offset 0x80 */5976 if (!write_eeprom(sp, 0x080, 0, 3))5977 fail = 1;5978 5979 /* Test Write Error at offset 0xfc */5980 if (!write_eeprom(sp, 0x0FC, 0, 3))5981 fail = 1;5982 5983 /* Test Write Error at offset 0x100 */5984 if (!write_eeprom(sp, 0x100, 0, 3))5985 fail = 1;5986 5987 /* Test Write Error at offset 4ec */5988 if (!write_eeprom(sp, 0x4EC, 0, 3))5989 fail = 1;5990 }5991 5992 /* Restore values at offsets 0x4F0 and 0x7F0 */5993 if (saved_4F0)5994 write_eeprom(sp, 0x4F0, org_4F0, 3);5995 if (saved_7F0)5996 write_eeprom(sp, 0x7F0, org_7F0, 3);5997 5998 *data = fail;5999 return fail;6000}6001 6002/**6003 * s2io_bist_test - invokes the MemBist test of the card .6004 * @sp : private member of the device structure, which is a pointer to the6005 * s2io_nic structure.6006 * @data:variable that returns the result of each of the test conducted by6007 * the driver.6008 * Description:6009 * This invokes the MemBist test of the card. We give around6010 * 2 secs time for the Test to complete. If it's still not complete6011 * within this peiod, we consider that the test failed.6012 * Return value:6013 * 0 on success and -1 on failure.6014 */6015 6016static int s2io_bist_test(struct s2io_nic *sp, uint64_t *data)6017{6018 u8 bist = 0;6019 int cnt = 0, ret = -1;6020 6021 pci_read_config_byte(sp->pdev, PCI_BIST, &bist);6022 bist |= PCI_BIST_START;6023 pci_write_config_word(sp->pdev, PCI_BIST, bist);6024 6025 while (cnt < 20) {6026 pci_read_config_byte(sp->pdev, PCI_BIST, &bist);6027 if (!(bist & PCI_BIST_START)) {6028 *data = (bist & PCI_BIST_CODE_MASK);6029 ret = 0;6030 break;6031 }6032 msleep(100);6033 cnt++;6034 }6035 6036 return ret;6037}6038 6039/**6040 * s2io_link_test - verifies the link state of the nic6041 * @sp: private member of the device structure, which is a pointer to the6042 * s2io_nic structure.6043 * @data: variable that returns the result of each of the test conducted by6044 * the driver.6045 * Description:6046 * The function verifies the link state of the NIC and updates the input6047 * argument 'data' appropriately.6048 * Return value:6049 * 0 on success.6050 */6051 6052static int s2io_link_test(struct s2io_nic *sp, uint64_t *data)6053{6054 struct XENA_dev_config __iomem *bar0 = sp->bar0;6055 u64 val64;6056 6057 val64 = readq(&bar0->adapter_status);6058 if (!(LINK_IS_UP(val64)))6059 *data = 1;6060 else6061 *data = 0;6062 6063 return *data;6064}6065 6066/**6067 * s2io_rldram_test - offline test for access to the RldRam chip on the NIC6068 * @sp: private member of the device structure, which is a pointer to the6069 * s2io_nic structure.6070 * @data: variable that returns the result of each of the test6071 * conducted by the driver.6072 * Description:6073 * This is one of the offline test that tests the read and write6074 * access to the RldRam chip on the NIC.6075 * Return value:6076 * 0 on success.6077 */6078 6079static int s2io_rldram_test(struct s2io_nic *sp, uint64_t *data)6080{6081 struct XENA_dev_config __iomem *bar0 = sp->bar0;6082 u64 val64;6083 int cnt, iteration = 0, test_fail = 0;6084 6085 val64 = readq(&bar0->adapter_control);6086 val64 &= ~ADAPTER_ECC_EN;6087 writeq(val64, &bar0->adapter_control);6088 6089 val64 = readq(&bar0->mc_rldram_test_ctrl);6090 val64 |= MC_RLDRAM_TEST_MODE;6091 SPECIAL_REG_WRITE(val64, &bar0->mc_rldram_test_ctrl, LF);6092 6093 val64 = readq(&bar0->mc_rldram_mrs);6094 val64 |= MC_RLDRAM_QUEUE_SIZE_ENABLE;6095 SPECIAL_REG_WRITE(val64, &bar0->mc_rldram_mrs, UF);6096 6097 val64 |= MC_RLDRAM_MRS_ENABLE;6098 SPECIAL_REG_WRITE(val64, &bar0->mc_rldram_mrs, UF);6099 6100 while (iteration < 2) {6101 val64 = 0x55555555aaaa0000ULL;6102 if (iteration == 1)6103 val64 ^= 0xFFFFFFFFFFFF0000ULL;6104 writeq(val64, &bar0->mc_rldram_test_d0);6105 6106 val64 = 0xaaaa5a5555550000ULL;6107 if (iteration == 1)6108 val64 ^= 0xFFFFFFFFFFFF0000ULL;6109 writeq(val64, &bar0->mc_rldram_test_d1);6110 6111 val64 = 0x55aaaaaaaa5a0000ULL;6112 if (iteration == 1)6113 val64 ^= 0xFFFFFFFFFFFF0000ULL;6114 writeq(val64, &bar0->mc_rldram_test_d2);6115 6116 val64 = (u64) (0x0000003ffffe0100ULL);6117 writeq(val64, &bar0->mc_rldram_test_add);6118 6119 val64 = MC_RLDRAM_TEST_MODE |6120 MC_RLDRAM_TEST_WRITE |6121 MC_RLDRAM_TEST_GO;6122 SPECIAL_REG_WRITE(val64, &bar0->mc_rldram_test_ctrl, LF);6123 6124 for (cnt = 0; cnt < 5; cnt++) {6125 val64 = readq(&bar0->mc_rldram_test_ctrl);6126 if (val64 & MC_RLDRAM_TEST_DONE)6127 break;6128 msleep(200);6129 }6130 6131 if (cnt == 5)6132 break;6133 6134 val64 = MC_RLDRAM_TEST_MODE | MC_RLDRAM_TEST_GO;6135 SPECIAL_REG_WRITE(val64, &bar0->mc_rldram_test_ctrl, LF);6136 6137 for (cnt = 0; cnt < 5; cnt++) {6138 val64 = readq(&bar0->mc_rldram_test_ctrl);6139 if (val64 & MC_RLDRAM_TEST_DONE)6140 break;6141 msleep(500);6142 }6143 6144 if (cnt == 5)6145 break;6146 6147 val64 = readq(&bar0->mc_rldram_test_ctrl);6148 if (!(val64 & MC_RLDRAM_TEST_PASS))6149 test_fail = 1;6150 6151 iteration++;6152 }6153 6154 *data = test_fail;6155 6156 /* Bring the adapter out of test mode */6157 SPECIAL_REG_WRITE(0, &bar0->mc_rldram_test_ctrl, LF);6158 6159 return test_fail;6160}6161 6162/**6163 * s2io_ethtool_test - conducts 6 tsets to determine the health of card.6164 * @dev: pointer to netdev6165 * @ethtest : pointer to a ethtool command specific structure that will be6166 * returned to the user.6167 * @data : variable that returns the result of each of the test6168 * conducted by the driver.6169 * Description:6170 * This function conducts 6 tests ( 4 offline and 2 online) to determine6171 * the health of the card.6172 * Return value:6173 * void6174 */6175 6176static void s2io_ethtool_test(struct net_device *dev,6177 struct ethtool_test *ethtest,6178 uint64_t *data)6179{6180 struct s2io_nic *sp = netdev_priv(dev);6181 int orig_state = netif_running(sp->dev);6182 6183 if (ethtest->flags == ETH_TEST_FL_OFFLINE) {6184 /* Offline Tests. */6185 if (orig_state)6186 s2io_close(sp->dev);6187 6188 if (s2io_register_test(sp, &data[0]))6189 ethtest->flags |= ETH_TEST_FL_FAILED;6190 6191 s2io_reset(sp);6192 6193 if (s2io_rldram_test(sp, &data[3]))6194 ethtest->flags |= ETH_TEST_FL_FAILED;6195 6196 s2io_reset(sp);6197 6198 if (s2io_eeprom_test(sp, &data[1]))6199 ethtest->flags |= ETH_TEST_FL_FAILED;6200 6201 if (s2io_bist_test(sp, &data[4]))6202 ethtest->flags |= ETH_TEST_FL_FAILED;6203 6204 if (orig_state)6205 s2io_open(sp->dev);6206 6207 data[2] = 0;6208 } else {6209 /* Online Tests. */6210 if (!orig_state) {6211 DBG_PRINT(ERR_DBG, "%s: is not up, cannot run test\n",6212 dev->name);6213 data[0] = -1;6214 data[1] = -1;6215 data[2] = -1;6216 data[3] = -1;6217 data[4] = -1;6218 }6219 6220 if (s2io_link_test(sp, &data[2]))6221 ethtest->flags |= ETH_TEST_FL_FAILED;6222 6223 data[0] = 0;6224 data[1] = 0;6225 data[3] = 0;6226 data[4] = 0;6227 }6228}6229 6230static void s2io_get_ethtool_stats(struct net_device *dev,6231 struct ethtool_stats *estats,6232 u64 *tmp_stats)6233{6234 int i = 0, k;6235 struct s2io_nic *sp = netdev_priv(dev);6236 struct stat_block *stats = sp->mac_control.stats_info;6237 struct swStat *swstats = &stats->sw_stat;6238 struct xpakStat *xstats = &stats->xpak_stat;6239 6240 s2io_updt_stats(sp);6241 tmp_stats[i++] =6242 (u64)le32_to_cpu(stats->tmac_frms_oflow) << 32 |6243 le32_to_cpu(stats->tmac_frms);6244 tmp_stats[i++] =6245 (u64)le32_to_cpu(stats->tmac_data_octets_oflow) << 32 |6246 le32_to_cpu(stats->tmac_data_octets);6247 tmp_stats[i++] = le64_to_cpu(stats->tmac_drop_frms);6248 tmp_stats[i++] =6249 (u64)le32_to_cpu(stats->tmac_mcst_frms_oflow) << 32 |6250 le32_to_cpu(stats->tmac_mcst_frms);6251 tmp_stats[i++] =6252 (u64)le32_to_cpu(stats->tmac_bcst_frms_oflow) << 32 |6253 le32_to_cpu(stats->tmac_bcst_frms);6254 tmp_stats[i++] = le64_to_cpu(stats->tmac_pause_ctrl_frms);6255 tmp_stats[i++] =6256 (u64)le32_to_cpu(stats->tmac_ttl_octets_oflow) << 32 |6257 le32_to_cpu(stats->tmac_ttl_octets);6258 tmp_stats[i++] =6259 (u64)le32_to_cpu(stats->tmac_ucst_frms_oflow) << 32 |6260 le32_to_cpu(stats->tmac_ucst_frms);6261 tmp_stats[i++] =6262 (u64)le32_to_cpu(stats->tmac_nucst_frms_oflow) << 32 |6263 le32_to_cpu(stats->tmac_nucst_frms);6264 tmp_stats[i++] =6265 (u64)le32_to_cpu(stats->tmac_any_err_frms_oflow) << 32 |6266 le32_to_cpu(stats->tmac_any_err_frms);6267 tmp_stats[i++] = le64_to_cpu(stats->tmac_ttl_less_fb_octets);6268 tmp_stats[i++] = le64_to_cpu(stats->tmac_vld_ip_octets);6269 tmp_stats[i++] =6270 (u64)le32_to_cpu(stats->tmac_vld_ip_oflow) << 32 |6271 le32_to_cpu(stats->tmac_vld_ip);6272 tmp_stats[i++] =6273 (u64)le32_to_cpu(stats->tmac_drop_ip_oflow) << 32 |6274 le32_to_cpu(stats->tmac_drop_ip);6275 tmp_stats[i++] =6276 (u64)le32_to_cpu(stats->tmac_icmp_oflow) << 32 |6277 le32_to_cpu(stats->tmac_icmp);6278 tmp_stats[i++] =6279 (u64)le32_to_cpu(stats->tmac_rst_tcp_oflow) << 32 |6280 le32_to_cpu(stats->tmac_rst_tcp);6281 tmp_stats[i++] = le64_to_cpu(stats->tmac_tcp);6282 tmp_stats[i++] = (u64)le32_to_cpu(stats->tmac_udp_oflow) << 32 |6283 le32_to_cpu(stats->tmac_udp);6284 tmp_stats[i++] =6285 (u64)le32_to_cpu(stats->rmac_vld_frms_oflow) << 32 |6286 le32_to_cpu(stats->rmac_vld_frms);6287 tmp_stats[i++] =6288 (u64)le32_to_cpu(stats->rmac_data_octets_oflow) << 32 |6289 le32_to_cpu(stats->rmac_data_octets);6290 tmp_stats[i++] = le64_to_cpu(stats->rmac_fcs_err_frms);6291 tmp_stats[i++] = le64_to_cpu(stats->rmac_drop_frms);6292 tmp_stats[i++] =6293 (u64)le32_to_cpu(stats->rmac_vld_mcst_frms_oflow) << 32 |6294 le32_to_cpu(stats->rmac_vld_mcst_frms);6295 tmp_stats[i++] =6296 (u64)le32_to_cpu(stats->rmac_vld_bcst_frms_oflow) << 32 |6297 le32_to_cpu(stats->rmac_vld_bcst_frms);6298 tmp_stats[i++] = le32_to_cpu(stats->rmac_in_rng_len_err_frms);6299 tmp_stats[i++] = le32_to_cpu(stats->rmac_out_rng_len_err_frms);6300 tmp_stats[i++] = le64_to_cpu(stats->rmac_long_frms);6301 tmp_stats[i++] = le64_to_cpu(stats->rmac_pause_ctrl_frms);6302 tmp_stats[i++] = le64_to_cpu(stats->rmac_unsup_ctrl_frms);6303 tmp_stats[i++] =6304 (u64)le32_to_cpu(stats->rmac_ttl_octets_oflow) << 32 |6305 le32_to_cpu(stats->rmac_ttl_octets);6306 tmp_stats[i++] =6307 (u64)le32_to_cpu(stats->rmac_accepted_ucst_frms_oflow) << 326308 | le32_to_cpu(stats->rmac_accepted_ucst_frms);6309 tmp_stats[i++] =6310 (u64)le32_to_cpu(stats->rmac_accepted_nucst_frms_oflow)6311 << 32 | le32_to_cpu(stats->rmac_accepted_nucst_frms);6312 tmp_stats[i++] =6313 (u64)le32_to_cpu(stats->rmac_discarded_frms_oflow) << 32 |6314 le32_to_cpu(stats->rmac_discarded_frms);6315 tmp_stats[i++] =6316 (u64)le32_to_cpu(stats->rmac_drop_events_oflow)6317 << 32 | le32_to_cpu(stats->rmac_drop_events);6318 tmp_stats[i++] = le64_to_cpu(stats->rmac_ttl_less_fb_octets);6319 tmp_stats[i++] = le64_to_cpu(stats->rmac_ttl_frms);6320 tmp_stats[i++] =6321 (u64)le32_to_cpu(stats->rmac_usized_frms_oflow) << 32 |6322 le32_to_cpu(stats->rmac_usized_frms);6323 tmp_stats[i++] =6324 (u64)le32_to_cpu(stats->rmac_osized_frms_oflow) << 32 |6325 le32_to_cpu(stats->rmac_osized_frms);6326 tmp_stats[i++] =6327 (u64)le32_to_cpu(stats->rmac_frag_frms_oflow) << 32 |6328 le32_to_cpu(stats->rmac_frag_frms);6329 tmp_stats[i++] =6330 (u64)le32_to_cpu(stats->rmac_jabber_frms_oflow) << 32 |6331 le32_to_cpu(stats->rmac_jabber_frms);6332 tmp_stats[i++] = le64_to_cpu(stats->rmac_ttl_64_frms);6333 tmp_stats[i++] = le64_to_cpu(stats->rmac_ttl_65_127_frms);6334 tmp_stats[i++] = le64_to_cpu(stats->rmac_ttl_128_255_frms);6335 tmp_stats[i++] = le64_to_cpu(stats->rmac_ttl_256_511_frms);6336 tmp_stats[i++] = le64_to_cpu(stats->rmac_ttl_512_1023_frms);6337 tmp_stats[i++] = le64_to_cpu(stats->rmac_ttl_1024_1518_frms);6338 tmp_stats[i++] =6339 (u64)le32_to_cpu(stats->rmac_ip_oflow) << 32 |6340 le32_to_cpu(stats->rmac_ip);6341 tmp_stats[i++] = le64_to_cpu(stats->rmac_ip_octets);6342 tmp_stats[i++] = le32_to_cpu(stats->rmac_hdr_err_ip);6343 tmp_stats[i++] =6344 (u64)le32_to_cpu(stats->rmac_drop_ip_oflow) << 32 |6345 le32_to_cpu(stats->rmac_drop_ip);6346 tmp_stats[i++] =6347 (u64)le32_to_cpu(stats->rmac_icmp_oflow) << 32 |6348 le32_to_cpu(stats->rmac_icmp);6349 tmp_stats[i++] = le64_to_cpu(stats->rmac_tcp);6350 tmp_stats[i++] =6351 (u64)le32_to_cpu(stats->rmac_udp_oflow) << 32 |6352 le32_to_cpu(stats->rmac_udp);6353 tmp_stats[i++] =6354 (u64)le32_to_cpu(stats->rmac_err_drp_udp_oflow) << 32 |6355 le32_to_cpu(stats->rmac_err_drp_udp);6356 tmp_stats[i++] = le64_to_cpu(stats->rmac_xgmii_err_sym);6357 tmp_stats[i++] = le64_to_cpu(stats->rmac_frms_q0);6358 tmp_stats[i++] = le64_to_cpu(stats->rmac_frms_q1);6359 tmp_stats[i++] = le64_to_cpu(stats->rmac_frms_q2);6360 tmp_stats[i++] = le64_to_cpu(stats->rmac_frms_q3);6361 tmp_stats[i++] = le64_to_cpu(stats->rmac_frms_q4);6362 tmp_stats[i++] = le64_to_cpu(stats->rmac_frms_q5);6363 tmp_stats[i++] = le64_to_cpu(stats->rmac_frms_q6);6364 tmp_stats[i++] = le64_to_cpu(stats->rmac_frms_q7);6365 tmp_stats[i++] = le16_to_cpu(stats->rmac_full_q0);6366 tmp_stats[i++] = le16_to_cpu(stats->rmac_full_q1);6367 tmp_stats[i++] = le16_to_cpu(stats->rmac_full_q2);6368 tmp_stats[i++] = le16_to_cpu(stats->rmac_full_q3);6369 tmp_stats[i++] = le16_to_cpu(stats->rmac_full_q4);6370 tmp_stats[i++] = le16_to_cpu(stats->rmac_full_q5);6371 tmp_stats[i++] = le16_to_cpu(stats->rmac_full_q6);6372 tmp_stats[i++] = le16_to_cpu(stats->rmac_full_q7);6373 tmp_stats[i++] =6374 (u64)le32_to_cpu(stats->rmac_pause_cnt_oflow) << 32 |6375 le32_to_cpu(stats->rmac_pause_cnt);6376 tmp_stats[i++] = le64_to_cpu(stats->rmac_xgmii_data_err_cnt);6377 tmp_stats[i++] = le64_to_cpu(stats->rmac_xgmii_ctrl_err_cnt);6378 tmp_stats[i++] =6379 (u64)le32_to_cpu(stats->rmac_accepted_ip_oflow) << 32 |6380 le32_to_cpu(stats->rmac_accepted_ip);6381 tmp_stats[i++] = le32_to_cpu(stats->rmac_err_tcp);6382 tmp_stats[i++] = le32_to_cpu(stats->rd_req_cnt);6383 tmp_stats[i++] = le32_to_cpu(stats->new_rd_req_cnt);6384 tmp_stats[i++] = le32_to_cpu(stats->new_rd_req_rtry_cnt);6385 tmp_stats[i++] = le32_to_cpu(stats->rd_rtry_cnt);6386 tmp_stats[i++] = le32_to_cpu(stats->wr_rtry_rd_ack_cnt);6387 tmp_stats[i++] = le32_to_cpu(stats->wr_req_cnt);6388 tmp_stats[i++] = le32_to_cpu(stats->new_wr_req_cnt);6389 tmp_stats[i++] = le32_to_cpu(stats->new_wr_req_rtry_cnt);6390 tmp_stats[i++] = le32_to_cpu(stats->wr_rtry_cnt);6391 tmp_stats[i++] = le32_to_cpu(stats->wr_disc_cnt);6392 tmp_stats[i++] = le32_to_cpu(stats->rd_rtry_wr_ack_cnt);6393 tmp_stats[i++] = le32_to_cpu(stats->txp_wr_cnt);6394 tmp_stats[i++] = le32_to_cpu(stats->txd_rd_cnt);6395 tmp_stats[i++] = le32_to_cpu(stats->txd_wr_cnt);6396 tmp_stats[i++] = le32_to_cpu(stats->rxd_rd_cnt);6397 tmp_stats[i++] = le32_to_cpu(stats->rxd_wr_cnt);6398 tmp_stats[i++] = le32_to_cpu(stats->txf_rd_cnt);6399 tmp_stats[i++] = le32_to_cpu(stats->rxf_wr_cnt);6400 6401 /* Enhanced statistics exist only for Hercules */6402 if (sp->device_type == XFRAME_II_DEVICE) {6403 tmp_stats[i++] =6404 le64_to_cpu(stats->rmac_ttl_1519_4095_frms);6405 tmp_stats[i++] =6406 le64_to_cpu(stats->rmac_ttl_4096_8191_frms);6407 tmp_stats[i++] =6408 le64_to_cpu(stats->rmac_ttl_8192_max_frms);6409 tmp_stats[i++] = le64_to_cpu(stats->rmac_ttl_gt_max_frms);6410 tmp_stats[i++] = le64_to_cpu(stats->rmac_osized_alt_frms);6411 tmp_stats[i++] = le64_to_cpu(stats->rmac_jabber_alt_frms);6412 tmp_stats[i++] = le64_to_cpu(stats->rmac_gt_max_alt_frms);6413 tmp_stats[i++] = le64_to_cpu(stats->rmac_vlan_frms);6414 tmp_stats[i++] = le32_to_cpu(stats->rmac_len_discard);6415 tmp_stats[i++] = le32_to_cpu(stats->rmac_fcs_discard);6416 tmp_stats[i++] = le32_to_cpu(stats->rmac_pf_discard);6417 tmp_stats[i++] = le32_to_cpu(stats->rmac_da_discard);6418 tmp_stats[i++] = le32_to_cpu(stats->rmac_red_discard);6419 tmp_stats[i++] = le32_to_cpu(stats->rmac_rts_discard);6420 tmp_stats[i++] = le32_to_cpu(stats->rmac_ingm_full_discard);6421 tmp_stats[i++] = le32_to_cpu(stats->link_fault_cnt);6422 }6423 6424 tmp_stats[i++] = 0;6425 tmp_stats[i++] = swstats->single_ecc_errs;6426 tmp_stats[i++] = swstats->double_ecc_errs;6427 tmp_stats[i++] = swstats->parity_err_cnt;6428 tmp_stats[i++] = swstats->serious_err_cnt;6429 tmp_stats[i++] = swstats->soft_reset_cnt;6430 tmp_stats[i++] = swstats->fifo_full_cnt;6431 for (k = 0; k < MAX_RX_RINGS; k++)6432 tmp_stats[i++] = swstats->ring_full_cnt[k];6433 tmp_stats[i++] = xstats->alarm_transceiver_temp_high;6434 tmp_stats[i++] = xstats->alarm_transceiver_temp_low;6435 tmp_stats[i++] = xstats->alarm_laser_bias_current_high;6436 tmp_stats[i++] = xstats->alarm_laser_bias_current_low;6437 tmp_stats[i++] = xstats->alarm_laser_output_power_high;6438 tmp_stats[i++] = xstats->alarm_laser_output_power_low;6439 tmp_stats[i++] = xstats->warn_transceiver_temp_high;6440 tmp_stats[i++] = xstats->warn_transceiver_temp_low;6441 tmp_stats[i++] = xstats->warn_laser_bias_current_high;6442 tmp_stats[i++] = xstats->warn_laser_bias_current_low;6443 tmp_stats[i++] = xstats->warn_laser_output_power_high;6444 tmp_stats[i++] = xstats->warn_laser_output_power_low;6445 tmp_stats[i++] = swstats->clubbed_frms_cnt;6446 tmp_stats[i++] = swstats->sending_both;6447 tmp_stats[i++] = swstats->outof_sequence_pkts;6448 tmp_stats[i++] = swstats->flush_max_pkts;6449 if (swstats->num_aggregations) {6450 u64 tmp = swstats->sum_avg_pkts_aggregated;6451 int count = 0;6452 /*6453 * Since 64-bit divide does not work on all platforms,6454 * do repeated subtraction.6455 */6456 while (tmp >= swstats->num_aggregations) {6457 tmp -= swstats->num_aggregations;6458 count++;6459 }6460 tmp_stats[i++] = count;6461 } else6462 tmp_stats[i++] = 0;6463 tmp_stats[i++] = swstats->mem_alloc_fail_cnt;6464 tmp_stats[i++] = swstats->pci_map_fail_cnt;6465 tmp_stats[i++] = swstats->watchdog_timer_cnt;6466 tmp_stats[i++] = swstats->mem_allocated;6467 tmp_stats[i++] = swstats->mem_freed;6468 tmp_stats[i++] = swstats->link_up_cnt;6469 tmp_stats[i++] = swstats->link_down_cnt;6470 tmp_stats[i++] = swstats->link_up_time;6471 tmp_stats[i++] = swstats->link_down_time;6472 6473 tmp_stats[i++] = swstats->tx_buf_abort_cnt;6474 tmp_stats[i++] = swstats->tx_desc_abort_cnt;6475 tmp_stats[i++] = swstats->tx_parity_err_cnt;6476 tmp_stats[i++] = swstats->tx_link_loss_cnt;6477 tmp_stats[i++] = swstats->tx_list_proc_err_cnt;6478 6479 tmp_stats[i++] = swstats->rx_parity_err_cnt;6480 tmp_stats[i++] = swstats->rx_abort_cnt;6481 tmp_stats[i++] = swstats->rx_parity_abort_cnt;6482 tmp_stats[i++] = swstats->rx_rda_fail_cnt;6483 tmp_stats[i++] = swstats->rx_unkn_prot_cnt;6484 tmp_stats[i++] = swstats->rx_fcs_err_cnt;6485 tmp_stats[i++] = swstats->rx_buf_size_err_cnt;6486 tmp_stats[i++] = swstats->rx_rxd_corrupt_cnt;6487 tmp_stats[i++] = swstats->rx_unkn_err_cnt;6488 tmp_stats[i++] = swstats->tda_err_cnt;6489 tmp_stats[i++] = swstats->pfc_err_cnt;6490 tmp_stats[i++] = swstats->pcc_err_cnt;6491 tmp_stats[i++] = swstats->tti_err_cnt;6492 tmp_stats[i++] = swstats->tpa_err_cnt;6493 tmp_stats[i++] = swstats->sm_err_cnt;6494 tmp_stats[i++] = swstats->lso_err_cnt;6495 tmp_stats[i++] = swstats->mac_tmac_err_cnt;6496 tmp_stats[i++] = swstats->mac_rmac_err_cnt;6497 tmp_stats[i++] = swstats->xgxs_txgxs_err_cnt;6498 tmp_stats[i++] = swstats->xgxs_rxgxs_err_cnt;6499 tmp_stats[i++] = swstats->rc_err_cnt;6500 tmp_stats[i++] = swstats->prc_pcix_err_cnt;6501 tmp_stats[i++] = swstats->rpa_err_cnt;6502 tmp_stats[i++] = swstats->rda_err_cnt;6503 tmp_stats[i++] = swstats->rti_err_cnt;6504 tmp_stats[i++] = swstats->mc_err_cnt;6505}6506 6507static int s2io_ethtool_get_regs_len(struct net_device *dev)6508{6509 return XENA_REG_SPACE;6510}6511 6512 6513static int s2io_get_eeprom_len(struct net_device *dev)6514{6515 return XENA_EEPROM_SPACE;6516}6517 6518static int s2io_get_sset_count(struct net_device *dev, int sset)6519{6520 struct s2io_nic *sp = netdev_priv(dev);6521 6522 switch (sset) {6523 case ETH_SS_TEST:6524 return S2IO_TEST_LEN;6525 case ETH_SS_STATS:6526 switch (sp->device_type) {6527 case XFRAME_I_DEVICE:6528 return XFRAME_I_STAT_LEN;6529 case XFRAME_II_DEVICE:6530 return XFRAME_II_STAT_LEN;6531 default:6532 return 0;6533 }6534 default:6535 return -EOPNOTSUPP;6536 }6537}6538 6539static void s2io_ethtool_get_strings(struct net_device *dev,6540 u32 stringset, u8 *data)6541{6542 int stat_size = 0;6543 struct s2io_nic *sp = netdev_priv(dev);6544 6545 switch (stringset) {6546 case ETH_SS_TEST:6547 memcpy(data, s2io_gstrings, S2IO_STRINGS_LEN);6548 break;6549 case ETH_SS_STATS:6550 stat_size = sizeof(ethtool_xena_stats_keys);6551 memcpy(data, ðtool_xena_stats_keys, stat_size);6552 if (sp->device_type == XFRAME_II_DEVICE) {6553 memcpy(data + stat_size,6554 ðtool_enhanced_stats_keys,6555 sizeof(ethtool_enhanced_stats_keys));6556 stat_size += sizeof(ethtool_enhanced_stats_keys);6557 }6558 6559 memcpy(data + stat_size, ðtool_driver_stats_keys,6560 sizeof(ethtool_driver_stats_keys));6561 }6562}6563 6564static int s2io_set_features(struct net_device *dev, netdev_features_t features)6565{6566 struct s2io_nic *sp = netdev_priv(dev);6567 netdev_features_t changed = (features ^ dev->features) & NETIF_F_LRO;6568 6569 if (changed && netif_running(dev)) {6570 int rc;6571 6572 s2io_stop_all_tx_queue(sp);6573 s2io_card_down(sp);6574 dev->features = features;6575 rc = s2io_card_up(sp);6576 if (rc)6577 s2io_reset(sp);6578 else6579 s2io_start_all_tx_queue(sp);6580 6581 return rc ? rc : 1;6582 }6583 6584 return 0;6585}6586 6587static const struct ethtool_ops netdev_ethtool_ops = {6588 .get_drvinfo = s2io_ethtool_gdrvinfo,6589 .get_regs_len = s2io_ethtool_get_regs_len,6590 .get_regs = s2io_ethtool_gregs,6591 .get_link = ethtool_op_get_link,6592 .get_eeprom_len = s2io_get_eeprom_len,6593 .get_eeprom = s2io_ethtool_geeprom,6594 .set_eeprom = s2io_ethtool_seeprom,6595 .get_ringparam = s2io_ethtool_gringparam,6596 .get_pauseparam = s2io_ethtool_getpause_data,6597 .set_pauseparam = s2io_ethtool_setpause_data,6598 .self_test = s2io_ethtool_test,6599 .get_strings = s2io_ethtool_get_strings,6600 .set_phys_id = s2io_ethtool_set_led,6601 .get_ethtool_stats = s2io_get_ethtool_stats,6602 .get_sset_count = s2io_get_sset_count,6603 .get_link_ksettings = s2io_ethtool_get_link_ksettings,6604 .set_link_ksettings = s2io_ethtool_set_link_ksettings,6605};6606 6607/**6608 * s2io_ioctl - Entry point for the Ioctl6609 * @dev : Device pointer.6610 * @rq : An IOCTL specefic structure, that can contain a pointer to6611 * a proprietary structure used to pass information to the driver.6612 * @cmd : This is used to distinguish between the different commands that6613 * can be passed to the IOCTL functions.6614 * Description:6615 * Currently there are no special functionality supported in IOCTL, hence6616 * function always return EOPNOTSUPPORTED6617 */6618 6619static int s2io_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)6620{6621 return -EOPNOTSUPP;6622}6623 6624/**6625 * s2io_change_mtu - entry point to change MTU size for the device.6626 * @dev : device pointer.6627 * @new_mtu : the new MTU size for the device.6628 * Description: A driver entry point to change MTU size for the device.6629 * Before changing the MTU the device must be stopped.6630 * Return value:6631 * 0 on success and an appropriate (-)ve integer as defined in errno.h6632 * file on failure.6633 */6634 6635static int s2io_change_mtu(struct net_device *dev, int new_mtu)6636{6637 struct s2io_nic *sp = netdev_priv(dev);6638 int ret = 0;6639 6640 WRITE_ONCE(dev->mtu, new_mtu);6641 if (netif_running(dev)) {6642 s2io_stop_all_tx_queue(sp);6643 s2io_card_down(sp);6644 ret = s2io_card_up(sp);6645 if (ret) {6646 DBG_PRINT(ERR_DBG, "%s: Device bring up failed\n",6647 __func__);6648 return ret;6649 }6650 s2io_wake_all_tx_queue(sp);6651 } else { /* Device is down */6652 struct XENA_dev_config __iomem *bar0 = sp->bar0;6653 u64 val64 = new_mtu;6654 6655 writeq(vBIT(val64, 2, 14), &bar0->rmac_max_pyld_len);6656 }6657 6658 return ret;6659}6660 6661/**6662 * s2io_set_link - Set the LInk status6663 * @work: work struct containing a pointer to device private structure6664 * Description: Sets the link status for the adapter6665 */6666 6667static void s2io_set_link(struct work_struct *work)6668{6669 struct s2io_nic *nic = container_of(work, struct s2io_nic,6670 set_link_task);6671 struct net_device *dev = nic->dev;6672 struct XENA_dev_config __iomem *bar0 = nic->bar0;6673 register u64 val64;6674 u16 subid;6675 6676 rtnl_lock();6677 6678 if (!netif_running(dev))6679 goto out_unlock;6680 6681 if (test_and_set_bit(__S2IO_STATE_LINK_TASK, &(nic->state))) {6682 /* The card is being reset, no point doing anything */6683 goto out_unlock;6684 }6685 6686 subid = nic->pdev->subsystem_device;6687 if (s2io_link_fault_indication(nic) == MAC_RMAC_ERR_TIMER) {6688 /*6689 * Allow a small delay for the NICs self initiated6690 * cleanup to complete.6691 */6692 msleep(100);6693 }6694 6695 val64 = readq(&bar0->adapter_status);6696 if (LINK_IS_UP(val64)) {6697 if (!(readq(&bar0->adapter_control) & ADAPTER_CNTL_EN)) {6698 if (verify_xena_quiescence(nic)) {6699 val64 = readq(&bar0->adapter_control);6700 val64 |= ADAPTER_CNTL_EN;6701 writeq(val64, &bar0->adapter_control);6702 if (CARDS_WITH_FAULTY_LINK_INDICATORS(6703 nic->device_type, subid)) {6704 val64 = readq(&bar0->gpio_control);6705 val64 |= GPIO_CTRL_GPIO_0;6706 writeq(val64, &bar0->gpio_control);6707 val64 = readq(&bar0->gpio_control);6708 } else {6709 val64 |= ADAPTER_LED_ON;6710 writeq(val64, &bar0->adapter_control);6711 }6712 nic->device_enabled_once = true;6713 } else {6714 DBG_PRINT(ERR_DBG,6715 "%s: Error: device is not Quiescent\n",6716 dev->name);6717 s2io_stop_all_tx_queue(nic);6718 }6719 }6720 val64 = readq(&bar0->adapter_control);6721 val64 |= ADAPTER_LED_ON;6722 writeq(val64, &bar0->adapter_control);6723 s2io_link(nic, LINK_UP);6724 } else {6725 if (CARDS_WITH_FAULTY_LINK_INDICATORS(nic->device_type,6726 subid)) {6727 val64 = readq(&bar0->gpio_control);6728 val64 &= ~GPIO_CTRL_GPIO_0;6729 writeq(val64, &bar0->gpio_control);6730 val64 = readq(&bar0->gpio_control);6731 }6732 /* turn off LED */6733 val64 = readq(&bar0->adapter_control);6734 val64 = val64 & (~ADAPTER_LED_ON);6735 writeq(val64, &bar0->adapter_control);6736 s2io_link(nic, LINK_DOWN);6737 }6738 clear_bit(__S2IO_STATE_LINK_TASK, &(nic->state));6739 6740out_unlock:6741 rtnl_unlock();6742}6743 6744static int set_rxd_buffer_pointer(struct s2io_nic *sp, struct RxD_t *rxdp,6745 struct buffAdd *ba,6746 struct sk_buff **skb, u64 *temp0, u64 *temp1,6747 u64 *temp2, int size)6748{6749 struct net_device *dev = sp->dev;6750 struct swStat *stats = &sp->mac_control.stats_info->sw_stat;6751 6752 if ((sp->rxd_mode == RXD_MODE_1) && (rxdp->Host_Control == 0)) {6753 struct RxD1 *rxdp1 = (struct RxD1 *)rxdp;6754 /* allocate skb */6755 if (*skb) {6756 DBG_PRINT(INFO_DBG, "SKB is not NULL\n");6757 /*6758 * As Rx frame are not going to be processed,6759 * using same mapped address for the Rxd6760 * buffer pointer6761 */6762 rxdp1->Buffer0_ptr = *temp0;6763 } else {6764 *skb = netdev_alloc_skb(dev, size);6765 if (!(*skb)) {6766 DBG_PRINT(INFO_DBG,6767 "%s: Out of memory to allocate %s\n",6768 dev->name, "1 buf mode SKBs");6769 stats->mem_alloc_fail_cnt++;6770 return -ENOMEM ;6771 }6772 stats->mem_allocated += (*skb)->truesize;6773 /* storing the mapped addr in a temp variable6774 * such it will be used for next rxd whose6775 * Host Control is NULL6776 */6777 rxdp1->Buffer0_ptr = *temp0 =6778 dma_map_single(&sp->pdev->dev, (*skb)->data,6779 size - NET_IP_ALIGN,6780 DMA_FROM_DEVICE);6781 if (dma_mapping_error(&sp->pdev->dev, rxdp1->Buffer0_ptr))6782 goto memalloc_failed;6783 rxdp->Host_Control = (unsigned long) (*skb);6784 }6785 } else if ((sp->rxd_mode == RXD_MODE_3B) && (rxdp->Host_Control == 0)) {6786 struct RxD3 *rxdp3 = (struct RxD3 *)rxdp;6787 /* Two buffer Mode */6788 if (*skb) {6789 rxdp3->Buffer2_ptr = *temp2;6790 rxdp3->Buffer0_ptr = *temp0;6791 rxdp3->Buffer1_ptr = *temp1;6792 } else {6793 *skb = netdev_alloc_skb(dev, size);6794 if (!(*skb)) {6795 DBG_PRINT(INFO_DBG,6796 "%s: Out of memory to allocate %s\n",6797 dev->name,6798 "2 buf mode SKBs");6799 stats->mem_alloc_fail_cnt++;6800 return -ENOMEM;6801 }6802 stats->mem_allocated += (*skb)->truesize;6803 rxdp3->Buffer2_ptr = *temp2 =6804 dma_map_single(&sp->pdev->dev, (*skb)->data,6805 dev->mtu + 4, DMA_FROM_DEVICE);6806 if (dma_mapping_error(&sp->pdev->dev, rxdp3->Buffer2_ptr))6807 goto memalloc_failed;6808 rxdp3->Buffer0_ptr = *temp0 =6809 dma_map_single(&sp->pdev->dev, ba->ba_0,6810 BUF0_LEN, DMA_FROM_DEVICE);6811 if (dma_mapping_error(&sp->pdev->dev, rxdp3->Buffer0_ptr)) {6812 dma_unmap_single(&sp->pdev->dev,6813 (dma_addr_t)rxdp3->Buffer2_ptr,6814 dev->mtu + 4,6815 DMA_FROM_DEVICE);6816 goto memalloc_failed;6817 }6818 rxdp->Host_Control = (unsigned long) (*skb);6819 6820 /* Buffer-1 will be dummy buffer not used */6821 rxdp3->Buffer1_ptr = *temp1 =6822 dma_map_single(&sp->pdev->dev, ba->ba_1,6823 BUF1_LEN, DMA_FROM_DEVICE);6824 if (dma_mapping_error(&sp->pdev->dev, rxdp3->Buffer1_ptr)) {6825 dma_unmap_single(&sp->pdev->dev,6826 (dma_addr_t)rxdp3->Buffer0_ptr,6827 BUF0_LEN, DMA_FROM_DEVICE);6828 dma_unmap_single(&sp->pdev->dev,6829 (dma_addr_t)rxdp3->Buffer2_ptr,6830 dev->mtu + 4,6831 DMA_FROM_DEVICE);6832 goto memalloc_failed;6833 }6834 }6835 }6836 return 0;6837 6838memalloc_failed:6839 stats->pci_map_fail_cnt++;6840 stats->mem_freed += (*skb)->truesize;6841 dev_kfree_skb(*skb);6842 return -ENOMEM;6843}6844 6845static void set_rxd_buffer_size(struct s2io_nic *sp, struct RxD_t *rxdp,6846 int size)6847{6848 struct net_device *dev = sp->dev;6849 if (sp->rxd_mode == RXD_MODE_1) {6850 rxdp->Control_2 = SET_BUFFER0_SIZE_1(size - NET_IP_ALIGN);6851 } else if (sp->rxd_mode == RXD_MODE_3B) {6852 rxdp->Control_2 = SET_BUFFER0_SIZE_3(BUF0_LEN);6853 rxdp->Control_2 |= SET_BUFFER1_SIZE_3(1);6854 rxdp->Control_2 |= SET_BUFFER2_SIZE_3(dev->mtu + 4);6855 }6856}6857 6858static int rxd_owner_bit_reset(struct s2io_nic *sp)6859{6860 int i, j, k, blk_cnt = 0, size;6861 struct config_param *config = &sp->config;6862 struct mac_info *mac_control = &sp->mac_control;6863 struct net_device *dev = sp->dev;6864 struct RxD_t *rxdp = NULL;6865 struct sk_buff *skb = NULL;6866 struct buffAdd *ba = NULL;6867 u64 temp0_64 = 0, temp1_64 = 0, temp2_64 = 0;6868 6869 /* Calculate the size based on ring mode */6870 size = dev->mtu + HEADER_ETHERNET_II_802_3_SIZE +6871 HEADER_802_2_SIZE + HEADER_SNAP_SIZE;6872 if (sp->rxd_mode == RXD_MODE_1)6873 size += NET_IP_ALIGN;6874 else if (sp->rxd_mode == RXD_MODE_3B)6875 size = dev->mtu + ALIGN_SIZE + BUF0_LEN + 4;6876 6877 for (i = 0; i < config->rx_ring_num; i++) {6878 struct rx_ring_config *rx_cfg = &config->rx_cfg[i];6879 struct ring_info *ring = &mac_control->rings[i];6880 6881 blk_cnt = rx_cfg->num_rxd / (rxd_count[sp->rxd_mode] + 1);6882 6883 for (j = 0; j < blk_cnt; j++) {6884 for (k = 0; k < rxd_count[sp->rxd_mode]; k++) {6885 rxdp = ring->rx_blocks[j].rxds[k].virt_addr;6886 if (sp->rxd_mode == RXD_MODE_3B)6887 ba = &ring->ba[j][k];6888 if (set_rxd_buffer_pointer(sp, rxdp, ba, &skb,6889 &temp0_64,6890 &temp1_64,6891 &temp2_64,6892 size) == -ENOMEM) {6893 return 0;6894 }6895 6896 set_rxd_buffer_size(sp, rxdp, size);6897 dma_wmb();6898 /* flip the Ownership bit to Hardware */6899 rxdp->Control_1 |= RXD_OWN_XENA;6900 }6901 }6902 }6903 return 0;6904 6905}6906 6907static int s2io_add_isr(struct s2io_nic *sp)6908{6909 int ret = 0;6910 struct net_device *dev = sp->dev;6911 int err = 0;6912 6913 if (sp->config.intr_type == MSI_X)6914 ret = s2io_enable_msi_x(sp);6915 if (ret) {6916 DBG_PRINT(ERR_DBG, "%s: Defaulting to INTA\n", dev->name);6917 sp->config.intr_type = INTA;6918 }6919 6920 /*6921 * Store the values of the MSIX table in6922 * the struct s2io_nic structure6923 */6924 store_xmsi_data(sp);6925 6926 /* After proper initialization of H/W, register ISR */6927 if (sp->config.intr_type == MSI_X) {6928 int i, msix_rx_cnt = 0;6929 6930 for (i = 0; i < sp->num_entries; i++) {6931 if (sp->s2io_entries[i].in_use == MSIX_FLG) {6932 if (sp->s2io_entries[i].type ==6933 MSIX_RING_TYPE) {6934 snprintf(sp->desc[i],6935 sizeof(sp->desc[i]),6936 "%s:MSI-X-%d-RX",6937 dev->name, i);6938 err = request_irq(sp->entries[i].vector,6939 s2io_msix_ring_handle,6940 0,6941 sp->desc[i],6942 sp->s2io_entries[i].arg);6943 } else if (sp->s2io_entries[i].type ==6944 MSIX_ALARM_TYPE) {6945 snprintf(sp->desc[i],6946 sizeof(sp->desc[i]),6947 "%s:MSI-X-%d-TX",6948 dev->name, i);6949 err = request_irq(sp->entries[i].vector,6950 s2io_msix_fifo_handle,6951 0,6952 sp->desc[i],6953 sp->s2io_entries[i].arg);6954 6955 }6956 /* if either data or addr is zero print it. */6957 if (!(sp->msix_info[i].addr &&6958 sp->msix_info[i].data)) {6959 DBG_PRINT(ERR_DBG,6960 "%s @Addr:0x%llx Data:0x%llx\n",6961 sp->desc[i],6962 (unsigned long long)6963 sp->msix_info[i].addr,6964 (unsigned long long)6965 ntohl(sp->msix_info[i].data));6966 } else6967 msix_rx_cnt++;6968 if (err) {6969 remove_msix_isr(sp);6970 6971 DBG_PRINT(ERR_DBG,6972 "%s:MSI-X-%d registration "6973 "failed\n", dev->name, i);6974 6975 DBG_PRINT(ERR_DBG,6976 "%s: Defaulting to INTA\n",6977 dev->name);6978 sp->config.intr_type = INTA;6979 break;6980 }6981 sp->s2io_entries[i].in_use =6982 MSIX_REGISTERED_SUCCESS;6983 }6984 }6985 if (!err) {6986 pr_info("MSI-X-RX %d entries enabled\n", --msix_rx_cnt);6987 DBG_PRINT(INFO_DBG,6988 "MSI-X-TX entries enabled through alarm vector\n");6989 }6990 }6991 if (sp->config.intr_type == INTA) {6992 err = request_irq(sp->pdev->irq, s2io_isr, IRQF_SHARED,6993 sp->name, dev);6994 if (err) {6995 DBG_PRINT(ERR_DBG, "%s: ISR registration failed\n",6996 dev->name);6997 return -1;6998 }6999 }7000 return 0;7001}7002 7003static void s2io_rem_isr(struct s2io_nic *sp)7004{7005 if (sp->config.intr_type == MSI_X)7006 remove_msix_isr(sp);7007 else7008 remove_inta_isr(sp);7009}7010 7011static void do_s2io_card_down(struct s2io_nic *sp, int do_io)7012{7013 int cnt = 0;7014 struct XENA_dev_config __iomem *bar0 = sp->bar0;7015 register u64 val64 = 0;7016 struct config_param *config;7017 config = &sp->config;7018 7019 if (!is_s2io_card_up(sp))7020 return;7021 7022 del_timer_sync(&sp->alarm_timer);7023 /* If s2io_set_link task is executing, wait till it completes. */7024 while (test_and_set_bit(__S2IO_STATE_LINK_TASK, &(sp->state)))7025 msleep(50);7026 clear_bit(__S2IO_STATE_CARD_UP, &sp->state);7027 7028 /* Disable napi */7029 if (sp->config.napi) {7030 int off = 0;7031 if (config->intr_type == MSI_X) {7032 for (; off < sp->config.rx_ring_num; off++)7033 napi_disable(&sp->mac_control.rings[off].napi);7034 }7035 else7036 napi_disable(&sp->napi);7037 }7038 7039 /* disable Tx and Rx traffic on the NIC */7040 if (do_io)7041 stop_nic(sp);7042 7043 s2io_rem_isr(sp);7044 7045 /* stop the tx queue, indicate link down */7046 s2io_link(sp, LINK_DOWN);7047 7048 /* Check if the device is Quiescent and then Reset the NIC */7049 while (do_io) {7050 /* As per the HW requirement we need to replenish the7051 * receive buffer to avoid the ring bump. Since there is7052 * no intention of processing the Rx frame at this pointwe are7053 * just setting the ownership bit of rxd in Each Rx7054 * ring to HW and set the appropriate buffer size7055 * based on the ring mode7056 */7057 rxd_owner_bit_reset(sp);7058 7059 val64 = readq(&bar0->adapter_status);7060 if (verify_xena_quiescence(sp)) {7061 if (verify_pcc_quiescent(sp, sp->device_enabled_once))7062 break;7063 }7064 7065 msleep(50);7066 cnt++;7067 if (cnt == 10) {7068 DBG_PRINT(ERR_DBG, "Device not Quiescent - "7069 "adapter status reads 0x%llx\n",7070 (unsigned long long)val64);7071 break;7072 }7073 }7074 if (do_io)7075 s2io_reset(sp);7076 7077 /* Free all Tx buffers */7078 free_tx_buffers(sp);7079 7080 /* Free all Rx buffers */7081 free_rx_buffers(sp);7082 7083 clear_bit(__S2IO_STATE_LINK_TASK, &(sp->state));7084}7085 7086static void s2io_card_down(struct s2io_nic *sp)7087{7088 do_s2io_card_down(sp, 1);7089}7090 7091static int s2io_card_up(struct s2io_nic *sp)7092{7093 int i, ret = 0;7094 struct config_param *config;7095 struct mac_info *mac_control;7096 struct net_device *dev = sp->dev;7097 u16 interruptible;7098 7099 /* Initialize the H/W I/O registers */7100 ret = init_nic(sp);7101 if (ret != 0) {7102 DBG_PRINT(ERR_DBG, "%s: H/W initialization failed\n",7103 dev->name);7104 if (ret != -EIO)7105 s2io_reset(sp);7106 return ret;7107 }7108 7109 /*7110 * Initializing the Rx buffers. For now we are considering only 17111 * Rx ring and initializing buffers into 30 Rx blocks7112 */7113 config = &sp->config;7114 mac_control = &sp->mac_control;7115 7116 for (i = 0; i < config->rx_ring_num; i++) {7117 struct ring_info *ring = &mac_control->rings[i];7118 7119 ring->mtu = dev->mtu;7120 ring->lro = !!(dev->features & NETIF_F_LRO);7121 ret = fill_rx_buffers(sp, ring, 1);7122 if (ret) {7123 DBG_PRINT(ERR_DBG, "%s: Out of memory in Open\n",7124 dev->name);7125 ret = -ENOMEM;7126 goto err_fill_buff;7127 }7128 DBG_PRINT(INFO_DBG, "Buf in ring:%d is %d:\n", i,7129 ring->rx_bufs_left);7130 }7131 7132 /* Initialise napi */7133 if (config->napi) {7134 if (config->intr_type == MSI_X) {7135 for (i = 0; i < sp->config.rx_ring_num; i++)7136 napi_enable(&sp->mac_control.rings[i].napi);7137 } else {7138 napi_enable(&sp->napi);7139 }7140 }7141 7142 /* Maintain the state prior to the open */7143 if (sp->promisc_flg)7144 sp->promisc_flg = 0;7145 if (sp->m_cast_flg) {7146 sp->m_cast_flg = 0;7147 sp->all_multi_pos = 0;7148 }7149 7150 /* Setting its receive mode */7151 s2io_set_multicast(dev, true);7152 7153 if (dev->features & NETIF_F_LRO) {7154 /* Initialize max aggregatable pkts per session based on MTU */7155 sp->lro_max_aggr_per_sess = ((1<<16) - 1) / dev->mtu;7156 /* Check if we can use (if specified) user provided value */7157 if (lro_max_pkts < sp->lro_max_aggr_per_sess)7158 sp->lro_max_aggr_per_sess = lro_max_pkts;7159 }7160 7161 /* Enable Rx Traffic and interrupts on the NIC */7162 if (start_nic(sp)) {7163 DBG_PRINT(ERR_DBG, "%s: Starting NIC failed\n", dev->name);7164 ret = -ENODEV;7165 goto err_out;7166 }7167 7168 /* Add interrupt service routine */7169 if (s2io_add_isr(sp) != 0) {7170 if (sp->config.intr_type == MSI_X)7171 s2io_rem_isr(sp);7172 ret = -ENODEV;7173 goto err_out;7174 }7175 7176 timer_setup(&sp->alarm_timer, s2io_alarm_handle, 0);7177 mod_timer(&sp->alarm_timer, jiffies + HZ / 2);7178 7179 set_bit(__S2IO_STATE_CARD_UP, &sp->state);7180 7181 /* Enable select interrupts */7182 en_dis_err_alarms(sp, ENA_ALL_INTRS, ENABLE_INTRS);7183 if (sp->config.intr_type != INTA) {7184 interruptible = TX_TRAFFIC_INTR | TX_PIC_INTR;7185 en_dis_able_nic_intrs(sp, interruptible, ENABLE_INTRS);7186 } else {7187 interruptible = TX_TRAFFIC_INTR | RX_TRAFFIC_INTR;7188 interruptible |= TX_PIC_INTR;7189 en_dis_able_nic_intrs(sp, interruptible, ENABLE_INTRS);7190 }7191 7192 return 0;7193 7194err_out:7195 if (config->napi) {7196 if (config->intr_type == MSI_X) {7197 for (i = 0; i < sp->config.rx_ring_num; i++)7198 napi_disable(&sp->mac_control.rings[i].napi);7199 } else {7200 napi_disable(&sp->napi);7201 }7202 }7203err_fill_buff:7204 s2io_reset(sp);7205 free_rx_buffers(sp);7206 return ret;7207}7208 7209/**7210 * s2io_restart_nic - Resets the NIC.7211 * @work : work struct containing a pointer to the device private structure7212 * Description:7213 * This function is scheduled to be run by the s2io_tx_watchdog7214 * function after 0.5 secs to reset the NIC. The idea is to reduce7215 * the run time of the watch dog routine which is run holding a7216 * spin lock.7217 */7218 7219static void s2io_restart_nic(struct work_struct *work)7220{7221 struct s2io_nic *sp = container_of(work, struct s2io_nic, rst_timer_task);7222 struct net_device *dev = sp->dev;7223 7224 rtnl_lock();7225 7226 if (!netif_running(dev))7227 goto out_unlock;7228 7229 s2io_card_down(sp);7230 if (s2io_card_up(sp)) {7231 DBG_PRINT(ERR_DBG, "%s: Device bring up failed\n", dev->name);7232 }7233 s2io_wake_all_tx_queue(sp);7234 DBG_PRINT(ERR_DBG, "%s: was reset by Tx watchdog timer\n", dev->name);7235out_unlock:7236 rtnl_unlock();7237}7238 7239/**7240 * s2io_tx_watchdog - Watchdog for transmit side.7241 * @dev : Pointer to net device structure7242 * @txqueue: index of the hanging queue7243 * Description:7244 * This function is triggered if the Tx Queue is stopped7245 * for a pre-defined amount of time when the Interface is still up.7246 * If the Interface is jammed in such a situation, the hardware is7247 * reset (by s2io_close) and restarted again (by s2io_open) to7248 * overcome any problem that might have been caused in the hardware.7249 * Return value:7250 * void7251 */7252 7253static void s2io_tx_watchdog(struct net_device *dev, unsigned int txqueue)7254{7255 struct s2io_nic *sp = netdev_priv(dev);7256 struct swStat *swstats = &sp->mac_control.stats_info->sw_stat;7257 7258 if (netif_carrier_ok(dev)) {7259 swstats->watchdog_timer_cnt++;7260 schedule_work(&sp->rst_timer_task);7261 swstats->soft_reset_cnt++;7262 }7263}7264 7265/**7266 * rx_osm_handler - To perform some OS related operations on SKB.7267 * @ring_data : the ring from which this RxD was extracted.7268 * @rxdp: descriptor7269 * Description:7270 * This function is called by the Rx interrupt serivce routine to perform7271 * some OS related operations on the SKB before passing it to the upper7272 * layers. It mainly checks if the checksum is OK, if so adds it to the7273 * SKBs cksum variable, increments the Rx packet count and passes the SKB7274 * to the upper layer. If the checksum is wrong, it increments the Rx7275 * packet error count, frees the SKB and returns error.7276 * Return value:7277 * SUCCESS on success and -1 on failure.7278 */7279static int rx_osm_handler(struct ring_info *ring_data, struct RxD_t * rxdp)7280{7281 struct s2io_nic *sp = ring_data->nic;7282 struct net_device *dev = ring_data->dev;7283 struct sk_buff *skb = (struct sk_buff *)7284 ((unsigned long)rxdp->Host_Control);7285 int ring_no = ring_data->ring_no;7286 u16 l3_csum, l4_csum;7287 unsigned long long err = rxdp->Control_1 & RXD_T_CODE;7288 struct lro *lro;7289 u8 err_mask;7290 struct swStat *swstats = &sp->mac_control.stats_info->sw_stat;7291 7292 skb->dev = dev;7293 7294 if (err) {7295 /* Check for parity error */7296 if (err & 0x1)7297 swstats->parity_err_cnt++;7298 7299 err_mask = err >> 48;7300 switch (err_mask) {7301 case 1:7302 swstats->rx_parity_err_cnt++;7303 break;7304 7305 case 2:7306 swstats->rx_abort_cnt++;7307 break;7308 7309 case 3:7310 swstats->rx_parity_abort_cnt++;7311 break;7312 7313 case 4:7314 swstats->rx_rda_fail_cnt++;7315 break;7316 7317 case 5:7318 swstats->rx_unkn_prot_cnt++;7319 break;7320 7321 case 6:7322 swstats->rx_fcs_err_cnt++;7323 break;7324 7325 case 7:7326 swstats->rx_buf_size_err_cnt++;7327 break;7328 7329 case 8:7330 swstats->rx_rxd_corrupt_cnt++;7331 break;7332 7333 case 15:7334 swstats->rx_unkn_err_cnt++;7335 break;7336 }7337 /*7338 * Drop the packet if bad transfer code. Exception being7339 * 0x5, which could be due to unsupported IPv6 extension header.7340 * In this case, we let stack handle the packet.7341 * Note that in this case, since checksum will be incorrect,7342 * stack will validate the same.7343 */7344 if (err_mask != 0x5) {7345 DBG_PRINT(ERR_DBG, "%s: Rx error Value: 0x%x\n",7346 dev->name, err_mask);7347 dev->stats.rx_crc_errors++;7348 swstats->mem_freed7349 += skb->truesize;7350 dev_kfree_skb(skb);7351 ring_data->rx_bufs_left -= 1;7352 rxdp->Host_Control = 0;7353 return 0;7354 }7355 }7356 7357 rxdp->Host_Control = 0;7358 if (sp->rxd_mode == RXD_MODE_1) {7359 int len = RXD_GET_BUFFER0_SIZE_1(rxdp->Control_2);7360 7361 skb_put(skb, len);7362 } else if (sp->rxd_mode == RXD_MODE_3B) {7363 int get_block = ring_data->rx_curr_get_info.block_index;7364 int get_off = ring_data->rx_curr_get_info.offset;7365 int buf0_len = RXD_GET_BUFFER0_SIZE_3(rxdp->Control_2);7366 int buf2_len = RXD_GET_BUFFER2_SIZE_3(rxdp->Control_2);7367 7368 struct buffAdd *ba = &ring_data->ba[get_block][get_off];7369 skb_put_data(skb, ba->ba_0, buf0_len);7370 skb_put(skb, buf2_len);7371 }7372 7373 if ((rxdp->Control_1 & TCP_OR_UDP_FRAME) &&7374 ((!ring_data->lro) ||7375 (!(rxdp->Control_1 & RXD_FRAME_IP_FRAG))) &&7376 (dev->features & NETIF_F_RXCSUM)) {7377 l3_csum = RXD_GET_L3_CKSUM(rxdp->Control_1);7378 l4_csum = RXD_GET_L4_CKSUM(rxdp->Control_1);7379 if ((l3_csum == L3_CKSUM_OK) && (l4_csum == L4_CKSUM_OK)) {7380 /*7381 * NIC verifies if the Checksum of the received7382 * frame is Ok or not and accordingly returns7383 * a flag in the RxD.7384 */7385 skb->ip_summed = CHECKSUM_UNNECESSARY;7386 if (ring_data->lro) {7387 u32 tcp_len = 0;7388 u8 *tcp;7389 int ret = 0;7390 7391 ret = s2io_club_tcp_session(ring_data,7392 skb->data, &tcp,7393 &tcp_len, &lro,7394 rxdp, sp);7395 switch (ret) {7396 case 3: /* Begin anew */7397 lro->parent = skb;7398 goto aggregate;7399 case 1: /* Aggregate */7400 lro_append_pkt(sp, lro, skb, tcp_len);7401 goto aggregate;7402 case 4: /* Flush session */7403 lro_append_pkt(sp, lro, skb, tcp_len);7404 queue_rx_frame(lro->parent,7405 lro->vlan_tag);7406 clear_lro_session(lro);7407 swstats->flush_max_pkts++;7408 goto aggregate;7409 case 2: /* Flush both */7410 lro->parent->data_len = lro->frags_len;7411 swstats->sending_both++;7412 queue_rx_frame(lro->parent,7413 lro->vlan_tag);7414 clear_lro_session(lro);7415 goto send_up;7416 case 0: /* sessions exceeded */7417 case -1: /* non-TCP or not L2 aggregatable */7418 case 5: /*7419 * First pkt in session not7420 * L3/L4 aggregatable7421 */7422 break;7423 default:7424 DBG_PRINT(ERR_DBG,7425 "%s: Samadhana!!\n",7426 __func__);7427 BUG();7428 }7429 }7430 } else {7431 /*7432 * Packet with erroneous checksum, let the7433 * upper layers deal with it.7434 */7435 skb_checksum_none_assert(skb);7436 }7437 } else7438 skb_checksum_none_assert(skb);7439 7440 swstats->mem_freed += skb->truesize;7441send_up:7442 skb_record_rx_queue(skb, ring_no);7443 queue_rx_frame(skb, RXD_GET_VLAN_TAG(rxdp->Control_2));7444aggregate:7445 sp->mac_control.rings[ring_no].rx_bufs_left -= 1;7446 return SUCCESS;7447}7448 7449/**7450 * s2io_link - stops/starts the Tx queue.7451 * @sp : private member of the device structure, which is a pointer to the7452 * s2io_nic structure.7453 * @link : inidicates whether link is UP/DOWN.7454 * Description:7455 * This function stops/starts the Tx queue depending on whether the link7456 * status of the NIC is down or up. This is called by the Alarm7457 * interrupt handler whenever a link change interrupt comes up.7458 * Return value:7459 * void.7460 */7461 7462static void s2io_link(struct s2io_nic *sp, int link)7463{7464 struct net_device *dev = sp->dev;7465 struct swStat *swstats = &sp->mac_control.stats_info->sw_stat;7466 7467 if (link != sp->last_link_state) {7468 init_tti(sp, link, false);7469 if (link == LINK_DOWN) {7470 DBG_PRINT(ERR_DBG, "%s: Link down\n", dev->name);7471 s2io_stop_all_tx_queue(sp);7472 netif_carrier_off(dev);7473 if (swstats->link_up_cnt)7474 swstats->link_up_time =7475 jiffies - sp->start_time;7476 swstats->link_down_cnt++;7477 } else {7478 DBG_PRINT(ERR_DBG, "%s: Link Up\n", dev->name);7479 if (swstats->link_down_cnt)7480 swstats->link_down_time =7481 jiffies - sp->start_time;7482 swstats->link_up_cnt++;7483 netif_carrier_on(dev);7484 s2io_wake_all_tx_queue(sp);7485 }7486 }7487 sp->last_link_state = link;7488 sp->start_time = jiffies;7489}7490 7491/**7492 * s2io_init_pci -Initialization of PCI and PCI-X configuration registers .7493 * @sp : private member of the device structure, which is a pointer to the7494 * s2io_nic structure.7495 * Description:7496 * This function initializes a few of the PCI and PCI-X configuration registers7497 * with recommended values.7498 * Return value:7499 * void7500 */7501 7502static void s2io_init_pci(struct s2io_nic *sp)7503{7504 u16 pci_cmd = 0, pcix_cmd = 0;7505 7506 /* Enable Data Parity Error Recovery in PCI-X command register. */7507 pci_read_config_word(sp->pdev, PCIX_COMMAND_REGISTER,7508 &(pcix_cmd));7509 pci_write_config_word(sp->pdev, PCIX_COMMAND_REGISTER,7510 (pcix_cmd | 1));7511 pci_read_config_word(sp->pdev, PCIX_COMMAND_REGISTER,7512 &(pcix_cmd));7513 7514 /* Set the PErr Response bit in PCI command register. */7515 pci_read_config_word(sp->pdev, PCI_COMMAND, &pci_cmd);7516 pci_write_config_word(sp->pdev, PCI_COMMAND,7517 (pci_cmd | PCI_COMMAND_PARITY));7518 pci_read_config_word(sp->pdev, PCI_COMMAND, &pci_cmd);7519}7520 7521static int s2io_verify_parm(struct pci_dev *pdev, u8 *dev_intr_type,7522 u8 *dev_multiq)7523{7524 int i;7525 7526 if ((tx_fifo_num > MAX_TX_FIFOS) || (tx_fifo_num < 1)) {7527 DBG_PRINT(ERR_DBG, "Requested number of tx fifos "7528 "(%d) not supported\n", tx_fifo_num);7529 7530 if (tx_fifo_num < 1)7531 tx_fifo_num = 1;7532 else7533 tx_fifo_num = MAX_TX_FIFOS;7534 7535 DBG_PRINT(ERR_DBG, "Default to %d tx fifos\n", tx_fifo_num);7536 }7537 7538 if (multiq)7539 *dev_multiq = multiq;7540 7541 if (tx_steering_type && (1 == tx_fifo_num)) {7542 if (tx_steering_type != TX_DEFAULT_STEERING)7543 DBG_PRINT(ERR_DBG,7544 "Tx steering is not supported with "7545 "one fifo. Disabling Tx steering.\n");7546 tx_steering_type = NO_STEERING;7547 }7548 7549 if ((tx_steering_type < NO_STEERING) ||7550 (tx_steering_type > TX_DEFAULT_STEERING)) {7551 DBG_PRINT(ERR_DBG,7552 "Requested transmit steering not supported\n");7553 DBG_PRINT(ERR_DBG, "Disabling transmit steering\n");7554 tx_steering_type = NO_STEERING;7555 }7556 7557 if (rx_ring_num > MAX_RX_RINGS) {7558 DBG_PRINT(ERR_DBG,7559 "Requested number of rx rings not supported\n");7560 DBG_PRINT(ERR_DBG, "Default to %d rx rings\n",7561 MAX_RX_RINGS);7562 rx_ring_num = MAX_RX_RINGS;7563 }7564 7565 if ((*dev_intr_type != INTA) && (*dev_intr_type != MSI_X)) {7566 DBG_PRINT(ERR_DBG, "Wrong intr_type requested. "7567 "Defaulting to INTA\n");7568 *dev_intr_type = INTA;7569 }7570 7571 if ((*dev_intr_type == MSI_X) &&7572 ((pdev->device != PCI_DEVICE_ID_HERC_WIN) &&7573 (pdev->device != PCI_DEVICE_ID_HERC_UNI))) {7574 DBG_PRINT(ERR_DBG, "Xframe I does not support MSI_X. "7575 "Defaulting to INTA\n");7576 *dev_intr_type = INTA;7577 }7578 7579 if ((rx_ring_mode != 1) && (rx_ring_mode != 2)) {7580 DBG_PRINT(ERR_DBG, "Requested ring mode not supported\n");7581 DBG_PRINT(ERR_DBG, "Defaulting to 1-buffer mode\n");7582 rx_ring_mode = 1;7583 }7584 7585 for (i = 0; i < MAX_RX_RINGS; i++)7586 if (rx_ring_sz[i] > MAX_RX_BLOCKS_PER_RING) {7587 DBG_PRINT(ERR_DBG, "Requested rx ring size not "7588 "supported\nDefaulting to %d\n",7589 MAX_RX_BLOCKS_PER_RING);7590 rx_ring_sz[i] = MAX_RX_BLOCKS_PER_RING;7591 }7592 7593 return SUCCESS;7594}7595 7596/**7597 * rts_ds_steer - Receive traffic steering based on IPv4 or IPv6 TOS or Traffic class respectively.7598 * @nic: device private variable7599 * @ds_codepoint: data7600 * @ring: ring index7601 * Description: The function configures the receive steering to7602 * desired receive ring.7603 * Return Value: SUCCESS on success and7604 * '-1' on failure (endian settings incorrect).7605 */7606static int rts_ds_steer(struct s2io_nic *nic, u8 ds_codepoint, u8 ring)7607{7608 struct XENA_dev_config __iomem *bar0 = nic->bar0;7609 register u64 val64 = 0;7610 7611 if (ds_codepoint > 63)7612 return FAILURE;7613 7614 val64 = RTS_DS_MEM_DATA(ring);7615 writeq(val64, &bar0->rts_ds_mem_data);7616 7617 val64 = RTS_DS_MEM_CTRL_WE |7618 RTS_DS_MEM_CTRL_STROBE_NEW_CMD |7619 RTS_DS_MEM_CTRL_OFFSET(ds_codepoint);7620 7621 writeq(val64, &bar0->rts_ds_mem_ctrl);7622 7623 return wait_for_cmd_complete(&bar0->rts_ds_mem_ctrl,7624 RTS_DS_MEM_CTRL_STROBE_CMD_BEING_EXECUTED,7625 S2IO_BIT_RESET, true);7626}7627 7628static const struct net_device_ops s2io_netdev_ops = {7629 .ndo_open = s2io_open,7630 .ndo_stop = s2io_close,7631 .ndo_get_stats = s2io_get_stats,7632 .ndo_start_xmit = s2io_xmit,7633 .ndo_validate_addr = eth_validate_addr,7634 .ndo_set_rx_mode = s2io_ndo_set_multicast,7635 .ndo_eth_ioctl = s2io_ioctl,7636 .ndo_set_mac_address = s2io_set_mac_addr,7637 .ndo_change_mtu = s2io_change_mtu,7638 .ndo_set_features = s2io_set_features,7639 .ndo_tx_timeout = s2io_tx_watchdog,7640#ifdef CONFIG_NET_POLL_CONTROLLER7641 .ndo_poll_controller = s2io_netpoll,7642#endif7643};7644 7645/**7646 * s2io_init_nic - Initialization of the adapter .7647 * @pdev : structure containing the PCI related information of the device.7648 * @pre: List of PCI devices supported by the driver listed in s2io_tbl.7649 * Description:7650 * The function initializes an adapter identified by the pci_dec structure.7651 * All OS related initialization including memory and device structure and7652 * initlaization of the device private variable is done. Also the swapper7653 * control register is initialized to enable read and write into the I/O7654 * registers of the device.7655 * Return value:7656 * returns 0 on success and negative on failure.7657 */7658 7659static int7660s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre)7661{7662 struct s2io_nic *sp;7663 struct net_device *dev;7664 int i, j, ret;7665 u32 mac_up, mac_down;7666 u64 val64 = 0, tmp64 = 0;7667 struct XENA_dev_config __iomem *bar0 = NULL;7668 u16 subid;7669 struct config_param *config;7670 struct mac_info *mac_control;7671 int mode;7672 u8 dev_intr_type = intr_type;7673 u8 dev_multiq = 0;7674 7675 ret = s2io_verify_parm(pdev, &dev_intr_type, &dev_multiq);7676 if (ret)7677 return ret;7678 7679 ret = pci_enable_device(pdev);7680 if (ret) {7681 DBG_PRINT(ERR_DBG,7682 "%s: pci_enable_device failed\n", __func__);7683 return ret;7684 }7685 7686 if (!dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64))) {7687 DBG_PRINT(INIT_DBG, "%s: Using 64bit DMA\n", __func__);7688 } else {7689 pci_disable_device(pdev);7690 return -ENOMEM;7691 }7692 ret = pci_request_regions(pdev, s2io_driver_name);7693 if (ret) {7694 DBG_PRINT(ERR_DBG, "%s: Request Regions failed - %x\n",7695 __func__, ret);7696 pci_disable_device(pdev);7697 return -ENODEV;7698 }7699 if (dev_multiq)7700 dev = alloc_etherdev_mq(sizeof(struct s2io_nic), tx_fifo_num);7701 else7702 dev = alloc_etherdev(sizeof(struct s2io_nic));7703 if (dev == NULL) {7704 pci_disable_device(pdev);7705 pci_release_regions(pdev);7706 return -ENODEV;7707 }7708 7709 pci_set_master(pdev);7710 pci_set_drvdata(pdev, dev);7711 SET_NETDEV_DEV(dev, &pdev->dev);7712 7713 /* Private member variable initialized to s2io NIC structure */7714 sp = netdev_priv(dev);7715 sp->dev = dev;7716 sp->pdev = pdev;7717 sp->device_enabled_once = false;7718 if (rx_ring_mode == 1)7719 sp->rxd_mode = RXD_MODE_1;7720 if (rx_ring_mode == 2)7721 sp->rxd_mode = RXD_MODE_3B;7722 7723 sp->config.intr_type = dev_intr_type;7724 7725 if ((pdev->device == PCI_DEVICE_ID_HERC_WIN) ||7726 (pdev->device == PCI_DEVICE_ID_HERC_UNI))7727 sp->device_type = XFRAME_II_DEVICE;7728 else7729 sp->device_type = XFRAME_I_DEVICE;7730 7731 7732 /* Initialize some PCI/PCI-X fields of the NIC. */7733 s2io_init_pci(sp);7734 7735 /*7736 * Setting the device configuration parameters.7737 * Most of these parameters can be specified by the user during7738 * module insertion as they are module loadable parameters. If7739 * these parameters are not specified during load time, they7740 * are initialized with default values.7741 */7742 config = &sp->config;7743 mac_control = &sp->mac_control;7744 7745 config->napi = napi;7746 config->tx_steering_type = tx_steering_type;7747 7748 /* Tx side parameters. */7749 if (config->tx_steering_type == TX_PRIORITY_STEERING)7750 config->tx_fifo_num = MAX_TX_FIFOS;7751 else7752 config->tx_fifo_num = tx_fifo_num;7753 7754 /* Initialize the fifos used for tx steering */7755 if (config->tx_fifo_num < 5) {7756 if (config->tx_fifo_num == 1)7757 sp->total_tcp_fifos = 1;7758 else7759 sp->total_tcp_fifos = config->tx_fifo_num - 1;7760 sp->udp_fifo_idx = config->tx_fifo_num - 1;7761 sp->total_udp_fifos = 1;7762 sp->other_fifo_idx = sp->total_tcp_fifos - 1;7763 } else {7764 sp->total_tcp_fifos = (tx_fifo_num - FIFO_UDP_MAX_NUM -7765 FIFO_OTHER_MAX_NUM);7766 sp->udp_fifo_idx = sp->total_tcp_fifos;7767 sp->total_udp_fifos = FIFO_UDP_MAX_NUM;7768 sp->other_fifo_idx = sp->udp_fifo_idx + FIFO_UDP_MAX_NUM;7769 }7770 7771 config->multiq = dev_multiq;7772 for (i = 0; i < config->tx_fifo_num; i++) {7773 struct tx_fifo_config *tx_cfg = &config->tx_cfg[i];7774 7775 tx_cfg->fifo_len = tx_fifo_len[i];7776 tx_cfg->fifo_priority = i;7777 }7778 7779 /* mapping the QoS priority to the configured fifos */7780 for (i = 0; i < MAX_TX_FIFOS; i++)7781 config->fifo_mapping[i] = fifo_map[config->tx_fifo_num - 1][i];7782 7783 /* map the hashing selector table to the configured fifos */7784 for (i = 0; i < config->tx_fifo_num; i++)7785 sp->fifo_selector[i] = fifo_selector[i];7786 7787 7788 config->tx_intr_type = TXD_INT_TYPE_UTILZ;7789 for (i = 0; i < config->tx_fifo_num; i++) {7790 struct tx_fifo_config *tx_cfg = &config->tx_cfg[i];7791 7792 tx_cfg->f_no_snoop = (NO_SNOOP_TXD | NO_SNOOP_TXD_BUFFER);7793 if (tx_cfg->fifo_len < 65) {7794 config->tx_intr_type = TXD_INT_TYPE_PER_LIST;7795 break;7796 }7797 }7798 /* + 2 because one Txd for skb->data and one Txd for UFO */7799 config->max_txds = MAX_SKB_FRAGS + 2;7800 7801 /* Rx side parameters. */7802 config->rx_ring_num = rx_ring_num;7803 for (i = 0; i < config->rx_ring_num; i++) {7804 struct rx_ring_config *rx_cfg = &config->rx_cfg[i];7805 struct ring_info *ring = &mac_control->rings[i];7806 7807 rx_cfg->num_rxd = rx_ring_sz[i] * (rxd_count[sp->rxd_mode] + 1);7808 rx_cfg->ring_priority = i;7809 ring->rx_bufs_left = 0;7810 ring->rxd_mode = sp->rxd_mode;7811 ring->rxd_count = rxd_count[sp->rxd_mode];7812 ring->pdev = sp->pdev;7813 ring->dev = sp->dev;7814 }7815 7816 for (i = 0; i < rx_ring_num; i++) {7817 struct rx_ring_config *rx_cfg = &config->rx_cfg[i];7818 7819 rx_cfg->ring_org = RING_ORG_BUFF1;7820 rx_cfg->f_no_snoop = (NO_SNOOP_RXD | NO_SNOOP_RXD_BUFFER);7821 }7822 7823 /* Setting Mac Control parameters */7824 mac_control->rmac_pause_time = rmac_pause_time;7825 mac_control->mc_pause_threshold_q0q3 = mc_pause_threshold_q0q3;7826 mac_control->mc_pause_threshold_q4q7 = mc_pause_threshold_q4q7;7827 7828 7829 /* initialize the shared memory used by the NIC and the host */7830 if (init_shared_mem(sp)) {7831 DBG_PRINT(ERR_DBG, "%s: Memory allocation failed\n", dev->name);7832 ret = -ENOMEM;7833 goto mem_alloc_failed;7834 }7835 7836 sp->bar0 = pci_ioremap_bar(pdev, 0);7837 if (!sp->bar0) {7838 DBG_PRINT(ERR_DBG, "%s: Neterion: cannot remap io mem1\n",7839 dev->name);7840 ret = -ENOMEM;7841 goto bar0_remap_failed;7842 }7843 7844 sp->bar1 = pci_ioremap_bar(pdev, 2);7845 if (!sp->bar1) {7846 DBG_PRINT(ERR_DBG, "%s: Neterion: cannot remap io mem2\n",7847 dev->name);7848 ret = -ENOMEM;7849 goto bar1_remap_failed;7850 }7851 7852 /* Initializing the BAR1 address as the start of the FIFO pointer. */7853 for (j = 0; j < MAX_TX_FIFOS; j++) {7854 mac_control->tx_FIFO_start[j] = sp->bar1 + (j * 0x00020000);7855 }7856 7857 /* Driver entry points */7858 dev->netdev_ops = &s2io_netdev_ops;7859 dev->ethtool_ops = &netdev_ethtool_ops;7860 dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM |7861 NETIF_F_TSO | NETIF_F_TSO6 |7862 NETIF_F_RXCSUM | NETIF_F_LRO;7863 dev->features |= dev->hw_features |7864 NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX |7865 NETIF_F_HIGHDMA;7866 dev->watchdog_timeo = WATCH_DOG_TIMEOUT;7867 INIT_WORK(&sp->rst_timer_task, s2io_restart_nic);7868 INIT_WORK(&sp->set_link_task, s2io_set_link);7869 7870 pci_save_state(sp->pdev);7871 7872 /* Setting swapper control on the NIC, for proper reset operation */7873 if (s2io_set_swapper(sp)) {7874 DBG_PRINT(ERR_DBG, "%s: swapper settings are wrong\n",7875 dev->name);7876 ret = -EAGAIN;7877 goto set_swap_failed;7878 }7879 7880 /* Verify if the Herc works on the slot its placed into */7881 if (sp->device_type & XFRAME_II_DEVICE) {7882 mode = s2io_verify_pci_mode(sp);7883 if (mode < 0) {7884 DBG_PRINT(ERR_DBG, "%s: Unsupported PCI bus mode\n",7885 __func__);7886 ret = -EBADSLT;7887 goto set_swap_failed;7888 }7889 }7890 7891 if (sp->config.intr_type == MSI_X) {7892 sp->num_entries = config->rx_ring_num + 1;7893 ret = s2io_enable_msi_x(sp);7894 7895 if (!ret) {7896 ret = s2io_test_msi(sp);7897 /* rollback MSI-X, will re-enable during add_isr() */7898 remove_msix_isr(sp);7899 }7900 if (ret) {7901 7902 DBG_PRINT(ERR_DBG,7903 "MSI-X requested but failed to enable\n");7904 sp->config.intr_type = INTA;7905 }7906 }7907 7908 if (config->intr_type == MSI_X) {7909 for (i = 0; i < config->rx_ring_num ; i++) {7910 struct ring_info *ring = &mac_control->rings[i];7911 7912 netif_napi_add(dev, &ring->napi, s2io_poll_msix);7913 }7914 } else {7915 netif_napi_add(dev, &sp->napi, s2io_poll_inta);7916 }7917 7918 /* Not needed for Herc */7919 if (sp->device_type & XFRAME_I_DEVICE) {7920 /*7921 * Fix for all "FFs" MAC address problems observed on7922 * Alpha platforms7923 */7924 fix_mac_address(sp);7925 s2io_reset(sp);7926 }7927 7928 /*7929 * MAC address initialization.7930 * For now only one mac address will be read and used.7931 */7932 bar0 = sp->bar0;7933 val64 = RMAC_ADDR_CMD_MEM_RD | RMAC_ADDR_CMD_MEM_STROBE_NEW_CMD |7934 RMAC_ADDR_CMD_MEM_OFFSET(0 + S2IO_MAC_ADDR_START_OFFSET);7935 writeq(val64, &bar0->rmac_addr_cmd_mem);7936 wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem,7937 RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING,7938 S2IO_BIT_RESET, true);7939 tmp64 = readq(&bar0->rmac_addr_data0_mem);7940 mac_down = (u32)tmp64;7941 mac_up = (u32) (tmp64 >> 32);7942 7943 sp->def_mac_addr[0].mac_addr[3] = (u8) (mac_up);7944 sp->def_mac_addr[0].mac_addr[2] = (u8) (mac_up >> 8);7945 sp->def_mac_addr[0].mac_addr[1] = (u8) (mac_up >> 16);7946 sp->def_mac_addr[0].mac_addr[0] = (u8) (mac_up >> 24);7947 sp->def_mac_addr[0].mac_addr[5] = (u8) (mac_down >> 16);7948 sp->def_mac_addr[0].mac_addr[4] = (u8) (mac_down >> 24);7949 7950 /* Set the factory defined MAC address initially */7951 dev->addr_len = ETH_ALEN;7952 eth_hw_addr_set(dev, sp->def_mac_addr[0].mac_addr);7953 7954 /* initialize number of multicast & unicast MAC entries variables */7955 if (sp->device_type == XFRAME_I_DEVICE) {7956 config->max_mc_addr = S2IO_XENA_MAX_MC_ADDRESSES;7957 config->max_mac_addr = S2IO_XENA_MAX_MAC_ADDRESSES;7958 config->mc_start_offset = S2IO_XENA_MC_ADDR_START_OFFSET;7959 } else if (sp->device_type == XFRAME_II_DEVICE) {7960 config->max_mc_addr = S2IO_HERC_MAX_MC_ADDRESSES;7961 config->max_mac_addr = S2IO_HERC_MAX_MAC_ADDRESSES;7962 config->mc_start_offset = S2IO_HERC_MC_ADDR_START_OFFSET;7963 }7964 7965 /* MTU range: 46 - 9600 */7966 dev->min_mtu = MIN_MTU;7967 dev->max_mtu = S2IO_JUMBO_SIZE;7968 7969 /* store mac addresses from CAM to s2io_nic structure */7970 do_s2io_store_unicast_mc(sp);7971 7972 /* Configure MSIX vector for number of rings configured plus one */7973 if ((sp->device_type == XFRAME_II_DEVICE) &&7974 (config->intr_type == MSI_X))7975 sp->num_entries = config->rx_ring_num + 1;7976 7977 /* Store the values of the MSIX table in the s2io_nic structure */7978 store_xmsi_data(sp);7979 /* reset Nic and bring it to known state */7980 s2io_reset(sp);7981 7982 /*7983 * Initialize link state flags7984 * and the card state parameter7985 */7986 sp->state = 0;7987 7988 /* Initialize spinlocks */7989 for (i = 0; i < sp->config.tx_fifo_num; i++) {7990 struct fifo_info *fifo = &mac_control->fifos[i];7991 7992 spin_lock_init(&fifo->tx_lock);7993 }7994 7995 /*7996 * SXE-002: Configure link and activity LED to init state7997 * on driver load.7998 */7999 subid = sp->pdev->subsystem_device;8000 if ((subid & 0xFF) >= 0x07) {8001 val64 = readq(&bar0->gpio_control);8002 val64 |= 0x0000800000000000ULL;8003 writeq(val64, &bar0->gpio_control);8004 val64 = 0x0411040400000000ULL;8005 writeq(val64, (void __iomem *)bar0 + 0x2700);8006 val64 = readq(&bar0->gpio_control);8007 }8008 8009 sp->rx_csum = 1; /* Rx chksum verify enabled by default */8010 8011 if (register_netdev(dev)) {8012 DBG_PRINT(ERR_DBG, "Device registration failed\n");8013 ret = -ENODEV;8014 goto register_failed;8015 }8016 s2io_vpd_read(sp);8017 DBG_PRINT(ERR_DBG, "Copyright(c) 2002-2010 Exar Corp.\n");8018 DBG_PRINT(ERR_DBG, "%s: Neterion %s (rev %d)\n", dev->name,8019 sp->product_name, pdev->revision);8020 DBG_PRINT(ERR_DBG, "%s: Driver version %s\n", dev->name,8021 s2io_driver_version);8022 DBG_PRINT(ERR_DBG, "%s: MAC Address: %pM\n", dev->name, dev->dev_addr);8023 DBG_PRINT(ERR_DBG, "Serial number: %s\n", sp->serial_num);8024 if (sp->device_type & XFRAME_II_DEVICE) {8025 mode = s2io_print_pci_mode(sp);8026 if (mode < 0) {8027 ret = -EBADSLT;8028 unregister_netdev(dev);8029 goto set_swap_failed;8030 }8031 }8032 switch (sp->rxd_mode) {8033 case RXD_MODE_1:8034 DBG_PRINT(ERR_DBG, "%s: 1-Buffer receive mode enabled\n",8035 dev->name);8036 break;8037 case RXD_MODE_3B:8038 DBG_PRINT(ERR_DBG, "%s: 2-Buffer receive mode enabled\n",8039 dev->name);8040 break;8041 }8042 8043 switch (sp->config.napi) {8044 case 0:8045 DBG_PRINT(ERR_DBG, "%s: NAPI disabled\n", dev->name);8046 break;8047 case 1:8048 DBG_PRINT(ERR_DBG, "%s: NAPI enabled\n", dev->name);8049 break;8050 }8051 8052 DBG_PRINT(ERR_DBG, "%s: Using %d Tx fifo(s)\n", dev->name,8053 sp->config.tx_fifo_num);8054 8055 DBG_PRINT(ERR_DBG, "%s: Using %d Rx ring(s)\n", dev->name,8056 sp->config.rx_ring_num);8057 8058 switch (sp->config.intr_type) {8059 case INTA:8060 DBG_PRINT(ERR_DBG, "%s: Interrupt type INTA\n", dev->name);8061 break;8062 case MSI_X:8063 DBG_PRINT(ERR_DBG, "%s: Interrupt type MSI-X\n", dev->name);8064 break;8065 }8066 if (sp->config.multiq) {8067 for (i = 0; i < sp->config.tx_fifo_num; i++) {8068 struct fifo_info *fifo = &mac_control->fifos[i];8069 8070 fifo->multiq = config->multiq;8071 }8072 DBG_PRINT(ERR_DBG, "%s: Multiqueue support enabled\n",8073 dev->name);8074 } else8075 DBG_PRINT(ERR_DBG, "%s: Multiqueue support disabled\n",8076 dev->name);8077 8078 switch (sp->config.tx_steering_type) {8079 case NO_STEERING:8080 DBG_PRINT(ERR_DBG, "%s: No steering enabled for transmit\n",8081 dev->name);8082 break;8083 case TX_PRIORITY_STEERING:8084 DBG_PRINT(ERR_DBG,8085 "%s: Priority steering enabled for transmit\n",8086 dev->name);8087 break;8088 case TX_DEFAULT_STEERING:8089 DBG_PRINT(ERR_DBG,8090 "%s: Default steering enabled for transmit\n",8091 dev->name);8092 }8093 8094 DBG_PRINT(ERR_DBG, "%s: Large receive offload enabled\n",8095 dev->name);8096 /* Initialize device name */8097 snprintf(sp->name, sizeof(sp->name), "%s Neterion %s", dev->name,8098 sp->product_name);8099 8100 if (vlan_tag_strip)8101 sp->vlan_strip_flag = 1;8102 else8103 sp->vlan_strip_flag = 0;8104 8105 /*8106 * Make Link state as off at this point, when the Link change8107 * interrupt comes the state will be automatically changed to8108 * the right state.8109 */8110 netif_carrier_off(dev);8111 8112 return 0;8113 8114register_failed:8115set_swap_failed:8116 iounmap(sp->bar1);8117bar1_remap_failed:8118 iounmap(sp->bar0);8119bar0_remap_failed:8120mem_alloc_failed:8121 free_shared_mem(sp);8122 pci_disable_device(pdev);8123 pci_release_regions(pdev);8124 free_netdev(dev);8125 8126 return ret;8127}8128 8129/**8130 * s2io_rem_nic - Free the PCI device8131 * @pdev: structure containing the PCI related information of the device.8132 * Description: This function is called by the Pci subsystem to release a8133 * PCI device and free up all resource held up by the device. This could8134 * be in response to a Hot plug event or when the driver is to be removed8135 * from memory.8136 */8137 8138static void s2io_rem_nic(struct pci_dev *pdev)8139{8140 struct net_device *dev = pci_get_drvdata(pdev);8141 struct s2io_nic *sp;8142 8143 if (dev == NULL) {8144 DBG_PRINT(ERR_DBG, "Driver Data is NULL!!\n");8145 return;8146 }8147 8148 sp = netdev_priv(dev);8149 8150 cancel_work_sync(&sp->rst_timer_task);8151 cancel_work_sync(&sp->set_link_task);8152 8153 unregister_netdev(dev);8154 8155 free_shared_mem(sp);8156 iounmap(sp->bar0);8157 iounmap(sp->bar1);8158 pci_release_regions(pdev);8159 free_netdev(dev);8160 pci_disable_device(pdev);8161}8162 8163module_pci_driver(s2io_driver);8164 8165static int check_L2_lro_capable(u8 *buffer, struct iphdr **ip,8166 struct tcphdr **tcp, struct RxD_t *rxdp,8167 struct s2io_nic *sp)8168{8169 int ip_off;8170 u8 l2_type = (u8)((rxdp->Control_1 >> 37) & 0x7), ip_len;8171 8172 if (!(rxdp->Control_1 & RXD_FRAME_PROTO_TCP)) {8173 DBG_PRINT(INIT_DBG,8174 "%s: Non-TCP frames not supported for LRO\n",8175 __func__);8176 return -1;8177 }8178 8179 /* Checking for DIX type or DIX type with VLAN */8180 if ((l2_type == 0) || (l2_type == 4)) {8181 ip_off = HEADER_ETHERNET_II_802_3_SIZE;8182 /*8183 * If vlan stripping is disabled and the frame is VLAN tagged,8184 * shift the offset by the VLAN header size bytes.8185 */8186 if ((!sp->vlan_strip_flag) &&8187 (rxdp->Control_1 & RXD_FRAME_VLAN_TAG))8188 ip_off += HEADER_VLAN_SIZE;8189 } else {8190 /* LLC, SNAP etc are considered non-mergeable */8191 return -1;8192 }8193 8194 *ip = (struct iphdr *)(buffer + ip_off);8195 ip_len = (u8)((*ip)->ihl);8196 ip_len <<= 2;8197 *tcp = (struct tcphdr *)((unsigned long)*ip + ip_len);8198 8199 return 0;8200}8201 8202static int check_for_socket_match(struct lro *lro, struct iphdr *ip,8203 struct tcphdr *tcp)8204{8205 DBG_PRINT(INFO_DBG, "%s: Been here...\n", __func__);8206 if ((lro->iph->saddr != ip->saddr) ||8207 (lro->iph->daddr != ip->daddr) ||8208 (lro->tcph->source != tcp->source) ||8209 (lro->tcph->dest != tcp->dest))8210 return -1;8211 return 0;8212}8213 8214static inline int get_l4_pyld_length(struct iphdr *ip, struct tcphdr *tcp)8215{8216 return ntohs(ip->tot_len) - (ip->ihl << 2) - (tcp->doff << 2);8217}8218 8219static void initiate_new_session(struct lro *lro, u8 *l2h,8220 struct iphdr *ip, struct tcphdr *tcp,8221 u32 tcp_pyld_len, u16 vlan_tag)8222{8223 DBG_PRINT(INFO_DBG, "%s: Been here...\n", __func__);8224 lro->l2h = l2h;8225 lro->iph = ip;8226 lro->tcph = tcp;8227 lro->tcp_next_seq = tcp_pyld_len + ntohl(tcp->seq);8228 lro->tcp_ack = tcp->ack_seq;8229 lro->sg_num = 1;8230 lro->total_len = ntohs(ip->tot_len);8231 lro->frags_len = 0;8232 lro->vlan_tag = vlan_tag;8233 /*8234 * Check if we saw TCP timestamp.8235 * Other consistency checks have already been done.8236 */8237 if (tcp->doff == 8) {8238 __be32 *ptr;8239 ptr = (__be32 *)(tcp+1);8240 lro->saw_ts = 1;8241 lro->cur_tsval = ntohl(*(ptr+1));8242 lro->cur_tsecr = *(ptr+2);8243 }8244 lro->in_use = 1;8245}8246 8247static void update_L3L4_header(struct s2io_nic *sp, struct lro *lro)8248{8249 struct iphdr *ip = lro->iph;8250 struct tcphdr *tcp = lro->tcph;8251 struct swStat *swstats = &sp->mac_control.stats_info->sw_stat;8252 8253 DBG_PRINT(INFO_DBG, "%s: Been here...\n", __func__);8254 8255 /* Update L3 header */8256 csum_replace2(&ip->check, ip->tot_len, htons(lro->total_len));8257 ip->tot_len = htons(lro->total_len);8258 8259 /* Update L4 header */8260 tcp->ack_seq = lro->tcp_ack;8261 tcp->window = lro->window;8262 8263 /* Update tsecr field if this session has timestamps enabled */8264 if (lro->saw_ts) {8265 __be32 *ptr = (__be32 *)(tcp + 1);8266 *(ptr+2) = lro->cur_tsecr;8267 }8268 8269 /* Update counters required for calculation of8270 * average no. of packets aggregated.8271 */8272 swstats->sum_avg_pkts_aggregated += lro->sg_num;8273 swstats->num_aggregations++;8274}8275 8276static void aggregate_new_rx(struct lro *lro, struct iphdr *ip,8277 struct tcphdr *tcp, u32 l4_pyld)8278{8279 DBG_PRINT(INFO_DBG, "%s: Been here...\n", __func__);8280 lro->total_len += l4_pyld;8281 lro->frags_len += l4_pyld;8282 lro->tcp_next_seq += l4_pyld;8283 lro->sg_num++;8284 8285 /* Update ack seq no. and window ad(from this pkt) in LRO object */8286 lro->tcp_ack = tcp->ack_seq;8287 lro->window = tcp->window;8288 8289 if (lro->saw_ts) {8290 __be32 *ptr;8291 /* Update tsecr and tsval from this packet */8292 ptr = (__be32 *)(tcp+1);8293 lro->cur_tsval = ntohl(*(ptr+1));8294 lro->cur_tsecr = *(ptr + 2);8295 }8296}8297 8298static int verify_l3_l4_lro_capable(struct lro *l_lro, struct iphdr *ip,8299 struct tcphdr *tcp, u32 tcp_pyld_len)8300{8301 u8 *ptr;8302 8303 DBG_PRINT(INFO_DBG, "%s: Been here...\n", __func__);8304 8305 if (!tcp_pyld_len) {8306 /* Runt frame or a pure ack */8307 return -1;8308 }8309 8310 if (ip->ihl != 5) /* IP has options */8311 return -1;8312 8313 /* If we see CE codepoint in IP header, packet is not mergeable */8314 if (INET_ECN_is_ce(ipv4_get_dsfield(ip)))8315 return -1;8316 8317 /* If we see ECE or CWR flags in TCP header, packet is not mergeable */8318 if (tcp->urg || tcp->psh || tcp->rst ||8319 tcp->syn || tcp->fin ||8320 tcp->ece || tcp->cwr || !tcp->ack) {8321 /*8322 * Currently recognize only the ack control word and8323 * any other control field being set would result in8324 * flushing the LRO session8325 */8326 return -1;8327 }8328 8329 /*8330 * Allow only one TCP timestamp option. Don't aggregate if8331 * any other options are detected.8332 */8333 if (tcp->doff != 5 && tcp->doff != 8)8334 return -1;8335 8336 if (tcp->doff == 8) {8337 ptr = (u8 *)(tcp + 1);8338 while (*ptr == TCPOPT_NOP)8339 ptr++;8340 if (*ptr != TCPOPT_TIMESTAMP || *(ptr+1) != TCPOLEN_TIMESTAMP)8341 return -1;8342 8343 /* Ensure timestamp value increases monotonically */8344 if (l_lro)8345 if (l_lro->cur_tsval > ntohl(*((__be32 *)(ptr+2))))8346 return -1;8347 8348 /* timestamp echo reply should be non-zero */8349 if (*((__be32 *)(ptr+6)) == 0)8350 return -1;8351 }8352 8353 return 0;8354}8355 8356static int s2io_club_tcp_session(struct ring_info *ring_data, u8 *buffer,8357 u8 **tcp, u32 *tcp_len, struct lro **lro,8358 struct RxD_t *rxdp, struct s2io_nic *sp)8359{8360 struct iphdr *ip;8361 struct tcphdr *tcph;8362 int ret = 0, i;8363 u16 vlan_tag = 0;8364 struct swStat *swstats = &sp->mac_control.stats_info->sw_stat;8365 8366 ret = check_L2_lro_capable(buffer, &ip, (struct tcphdr **)tcp,8367 rxdp, sp);8368 if (ret)8369 return ret;8370 8371 DBG_PRINT(INFO_DBG, "IP Saddr: %x Daddr: %x\n", ip->saddr, ip->daddr);8372 8373 vlan_tag = RXD_GET_VLAN_TAG(rxdp->Control_2);8374 tcph = (struct tcphdr *)*tcp;8375 *tcp_len = get_l4_pyld_length(ip, tcph);8376 for (i = 0; i < MAX_LRO_SESSIONS; i++) {8377 struct lro *l_lro = &ring_data->lro0_n[i];8378 if (l_lro->in_use) {8379 if (check_for_socket_match(l_lro, ip, tcph))8380 continue;8381 /* Sock pair matched */8382 *lro = l_lro;8383 8384 if ((*lro)->tcp_next_seq != ntohl(tcph->seq)) {8385 DBG_PRINT(INFO_DBG, "%s: Out of sequence. "8386 "expected 0x%x, actual 0x%x\n",8387 __func__,8388 (*lro)->tcp_next_seq,8389 ntohl(tcph->seq));8390 8391 swstats->outof_sequence_pkts++;8392 ret = 2;8393 break;8394 }8395 8396 if (!verify_l3_l4_lro_capable(l_lro, ip, tcph,8397 *tcp_len))8398 ret = 1; /* Aggregate */8399 else8400 ret = 2; /* Flush both */8401 break;8402 }8403 }8404 8405 if (ret == 0) {8406 /* Before searching for available LRO objects,8407 * check if the pkt is L3/L4 aggregatable. If not8408 * don't create new LRO session. Just send this8409 * packet up.8410 */8411 if (verify_l3_l4_lro_capable(NULL, ip, tcph, *tcp_len))8412 return 5;8413 8414 for (i = 0; i < MAX_LRO_SESSIONS; i++) {8415 struct lro *l_lro = &ring_data->lro0_n[i];8416 if (!(l_lro->in_use)) {8417 *lro = l_lro;8418 ret = 3; /* Begin anew */8419 break;8420 }8421 }8422 }8423 8424 if (ret == 0) { /* sessions exceeded */8425 DBG_PRINT(INFO_DBG, "%s: All LRO sessions already in use\n",8426 __func__);8427 *lro = NULL;8428 return ret;8429 }8430 8431 switch (ret) {8432 case 3:8433 initiate_new_session(*lro, buffer, ip, tcph, *tcp_len,8434 vlan_tag);8435 break;8436 case 2:8437 update_L3L4_header(sp, *lro);8438 break;8439 case 1:8440 aggregate_new_rx(*lro, ip, tcph, *tcp_len);8441 if ((*lro)->sg_num == sp->lro_max_aggr_per_sess) {8442 update_L3L4_header(sp, *lro);8443 ret = 4; /* Flush the LRO */8444 }8445 break;8446 default:8447 DBG_PRINT(ERR_DBG, "%s: Don't know, can't say!!\n", __func__);8448 break;8449 }8450 8451 return ret;8452}8453 8454static void clear_lro_session(struct lro *lro)8455{8456 static u16 lro_struct_size = sizeof(struct lro);8457 8458 memset(lro, 0, lro_struct_size);8459}8460 8461static void queue_rx_frame(struct sk_buff *skb, u16 vlan_tag)8462{8463 struct net_device *dev = skb->dev;8464 struct s2io_nic *sp = netdev_priv(dev);8465 8466 skb->protocol = eth_type_trans(skb, dev);8467 if (vlan_tag && sp->vlan_strip_flag)8468 __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vlan_tag);8469 if (sp->config.napi)8470 netif_receive_skb(skb);8471 else8472 netif_rx(skb);8473}8474 8475static void lro_append_pkt(struct s2io_nic *sp, struct lro *lro,8476 struct sk_buff *skb, u32 tcp_len)8477{8478 struct sk_buff *first = lro->parent;8479 struct swStat *swstats = &sp->mac_control.stats_info->sw_stat;8480 8481 first->len += tcp_len;8482 first->data_len = lro->frags_len;8483 skb_pull(skb, (skb->len - tcp_len));8484 if (skb_shinfo(first)->frag_list)8485 lro->last_frag->next = skb;8486 else8487 skb_shinfo(first)->frag_list = skb;8488 first->truesize += skb->truesize;8489 lro->last_frag = skb;8490 swstats->clubbed_frms_cnt++;8491}8492 8493/**8494 * s2io_io_error_detected - called when PCI error is detected8495 * @pdev: Pointer to PCI device8496 * @state: The current pci connection state8497 *8498 * This function is called after a PCI bus error affecting8499 * this device has been detected.8500 */8501static pci_ers_result_t s2io_io_error_detected(struct pci_dev *pdev,8502 pci_channel_state_t state)8503{8504 struct net_device *netdev = pci_get_drvdata(pdev);8505 struct s2io_nic *sp = netdev_priv(netdev);8506 8507 netif_device_detach(netdev);8508 8509 if (state == pci_channel_io_perm_failure)8510 return PCI_ERS_RESULT_DISCONNECT;8511 8512 if (netif_running(netdev)) {8513 /* Bring down the card, while avoiding PCI I/O */8514 do_s2io_card_down(sp, 0);8515 }8516 pci_disable_device(pdev);8517 8518 return PCI_ERS_RESULT_NEED_RESET;8519}8520 8521/**8522 * s2io_io_slot_reset - called after the pci bus has been reset.8523 * @pdev: Pointer to PCI device8524 *8525 * Restart the card from scratch, as if from a cold-boot.8526 * At this point, the card has exprienced a hard reset,8527 * followed by fixups by BIOS, and has its config space8528 * set up identically to what it was at cold boot.8529 */8530static pci_ers_result_t s2io_io_slot_reset(struct pci_dev *pdev)8531{8532 struct net_device *netdev = pci_get_drvdata(pdev);8533 struct s2io_nic *sp = netdev_priv(netdev);8534 8535 if (pci_enable_device(pdev)) {8536 pr_err("Cannot re-enable PCI device after reset.\n");8537 return PCI_ERS_RESULT_DISCONNECT;8538 }8539 8540 pci_set_master(pdev);8541 s2io_reset(sp);8542 8543 return PCI_ERS_RESULT_RECOVERED;8544}8545 8546/**8547 * s2io_io_resume - called when traffic can start flowing again.8548 * @pdev: Pointer to PCI device8549 *8550 * This callback is called when the error recovery driver tells8551 * us that its OK to resume normal operation.8552 */8553static void s2io_io_resume(struct pci_dev *pdev)8554{8555 struct net_device *netdev = pci_get_drvdata(pdev);8556 struct s2io_nic *sp = netdev_priv(netdev);8557 8558 if (netif_running(netdev)) {8559 if (s2io_card_up(sp)) {8560 pr_err("Can't bring device back up after reset.\n");8561 return;8562 }8563 8564 if (do_s2io_prog_unicast(netdev, netdev->dev_addr) == FAILURE) {8565 s2io_card_down(sp);8566 pr_err("Can't restore mac addr after reset.\n");8567 return;8568 }8569 }8570 8571 netif_device_attach(netdev);8572 netif_tx_wake_all_queues(netdev);8573}8574