Lines Matching refs:bp

266 static void		dfx_bus_config_check(DFX_board_t *bp);
271 static int dfx_adap_init(DFX_board_t *bp, int get_buffers);
276 static void dfx_int_pr_halt_id(DFX_board_t *bp);
277 static void dfx_int_type_0_process(DFX_board_t *bp);
284 static int dfx_ctl_update_cam(DFX_board_t *bp);
285 static int dfx_ctl_update_filters(DFX_board_t *bp);
287 static int dfx_hw_dma_cmd_req(DFX_board_t *bp);
288 static int dfx_hw_port_ctrl_req(DFX_board_t *bp, PI_UINT32 command, PI_UINT32 data_a, PI_UINT32 data_b, PI_UINT32 *host_data);
289 static void dfx_hw_adap_reset(DFX_board_t *bp, PI_UINT32 type);
290 static int dfx_hw_adap_state_rd(DFX_board_t *bp);
291 static int dfx_hw_dma_uninit(DFX_board_t *bp, PI_UINT32 type);
293 static int dfx_rcv_init(DFX_board_t *bp, int get_buffers);
294 static void dfx_rcv_queue_process(DFX_board_t *bp);
296 static void dfx_rcv_flush(DFX_board_t *bp);
298 static inline void dfx_rcv_flush(DFX_board_t *bp) {}
303 static int dfx_xmt_done(DFX_board_t *bp);
304 static void dfx_xmt_flush(DFX_board_t *bp);
326 * bp - pointer to board information
352 * bp->base is a valid base I/O address for this adapter.
363 static inline void dfx_writel(DFX_board_t *bp, int offset, u32 data)
365 writel(data, bp->base.mem + offset);
369 static inline void dfx_outl(DFX_board_t *bp, int offset, u32 data)
371 outl(data, bp->base.port + offset);
374 static void dfx_port_write_long(DFX_board_t *bp, int offset, u32 data)
376 struct device __maybe_unused *bdev = bp->bus_dev;
381 dfx_writel(bp, offset, data);
383 dfx_outl(bp, offset, data);
387 static inline void dfx_readl(DFX_board_t *bp, int offset, u32 *data)
390 *data = readl(bp->base.mem + offset);
393 static inline void dfx_inl(DFX_board_t *bp, int offset, u32 *data)
395 *data = inl(bp->base.port + offset);
398 static void dfx_port_read_long(DFX_board_t *bp, int offset, u32 *data)
400 struct device __maybe_unused *bdev = bp->bus_dev;
405 dfx_readl(bp, offset, data);
407 dfx_inl(bp, offset, data);
554 DFX_board_t *bp; /* board pointer */
566 dev = alloc_fddidev(sizeof(*bp));
585 bp = netdev_priv(dev);
586 bp->bus_dev = bdev;
630 bp->base.mem = ioremap(bar_start[0], bar_len[0]);
631 if (!bp->base.mem) {
637 bp->base.port = bar_start[0];
663 (bp->rcv_bufs_to_post * PI_RCV_DATA_K_SIZE_MAX) +
667 if (bp->kmalloced)
669 bp->kmalloced, bp->kmalloced_dma);
673 iounmap(bp->base.mem);
721 * bp->base has already been set with the proper
732 DFX_board_t *bp = netdev_priv(dev);
733 struct device *bdev = bp->bus_dev;
743 bp->dev = dev;
858 dfx_port_write_long(bp, PFI_K_REG_MODE_CTRL, val);
883 * bp->base has already been set with the proper
892 DFX_board_t *bp = netdev_priv(dev);
893 struct device *bdev = bp->bus_dev;
918 dfx_port_write_long(bp, PFI_K_REG_MODE_CTRL, 0);
936 * bp - pointer to board information
953 static void dfx_bus_config_check(DFX_board_t *bp)
955 struct device __maybe_unused *bdev = bp->bus_dev;
977 status = dfx_hw_port_ctrl_req(bp,
992 switch (bp->burst_size)
996 bp->burst_size = PI_PDATA_B_DMA_BURST_SIZE_8;
1005 bp->full_duplex_enb = PI_SNMP_K_FALSE;
1052 DFX_board_t *bp = netdev_priv(dev);
1053 struct device *bdev = bp->bus_dev;
1080 bp->full_duplex_enb = PI_SNMP_K_FALSE;
1081 bp->req_ttrt = 8 * 12500; /* 8ms in 80 nanosec units */
1082 bp->burst_size = PI_PDATA_B_DMA_BURST_SIZE_DEF;
1083 bp->rcv_bufs_to_post = RCV_BUFS_DEF;
1094 dfx_bus_config_check(bp);
1098 dfx_port_write_long(bp, PI_PDQ_K_REG_HOST_INT_ENB, PI_HOST_INT_K_DISABLE_ALL_INTS);
1102 (void) dfx_hw_dma_uninit(bp, PI_PDATA_A_RESET_M_SKIP_ST);
1106 if (dfx_hw_port_ctrl_req(bp, PI_PCTRL_M_MLA, PI_PDATA_A_MLA_K_LO, 0,
1113 memcpy(&bp->factory_mac_addr[0], &le32, sizeof(u32));
1115 if (dfx_hw_port_ctrl_req(bp, PI_PCTRL_M_MLA, PI_PDATA_A_MLA_K_HI, 0,
1122 memcpy(&bp->factory_mac_addr[4], &le32, sizeof(u16));
1131 memcpy(dev->dev_addr, bp->factory_mac_addr, FDDI_K_ALEN);
1151 (bp->rcv_bufs_to_post * PI_RCV_DATA_K_SIZE_MAX) +
1155 bp->kmalloced = top_v = dma_alloc_coherent(bp->bus_dev, alloc_size,
1156 &bp->kmalloced_dma,
1161 top_p = bp->kmalloced_dma; /* get physical address of buffer */
1180 bp->descr_block_virt = (PI_DESCR_BLOCK *) curr_v;
1181 bp->descr_block_phys = curr_p;
1187 bp->cmd_req_virt = (PI_DMA_CMD_REQ *) curr_v;
1188 bp->cmd_req_phys = curr_p;
1194 bp->cmd_rsp_virt = (PI_DMA_CMD_RSP *) curr_v;
1195 bp->cmd_rsp_phys = curr_p;
1201 bp->rcv_block_virt = curr_v;
1202 bp->rcv_block_phys = curr_p;
1205 curr_v += (bp->rcv_bufs_to_post * PI_RCV_DATA_K_SIZE_MAX);
1206 curr_p += (bp->rcv_bufs_to_post * PI_RCV_DATA_K_SIZE_MAX);
1211 bp->cons_block_virt = (PI_CONSUMER_BLOCK *) curr_v;
1212 bp->cons_block_phys = curr_p;
1217 print_name, bp->descr_block_virt, &bp->descr_block_phys);
1219 print_name, bp->cmd_req_virt, &bp->cmd_req_phys);
1221 print_name, bp->cmd_rsp_virt, &bp->cmd_rsp_phys);
1223 print_name, bp->rcv_block_virt, &bp->rcv_block_phys);
1225 print_name, bp->cons_block_virt, &bp->cons_block_phys);
1243 * bp - pointer to board information
1256 * bp->reset_type should be set to a valid reset type value before
1264 static int dfx_adap_init(DFX_board_t *bp, int get_buffers)
1270 dfx_port_write_long(bp, PI_PDQ_K_REG_HOST_INT_ENB, PI_HOST_INT_K_DISABLE_ALL_INTS);
1274 if (dfx_hw_dma_uninit(bp, bp->reset_type) != DFX_K_SUCCESS)
1276 printk("%s: Could not uninitialize/reset adapter!\n", bp->dev->name);
1285 dfx_port_write_long(bp, PI_PDQ_K_REG_TYPE_0_STATUS, PI_HOST_INT_K_ACK_ALL_TYPE_0);
1294 bp->cmd_req_reg.lword = 0;
1295 bp->cmd_rsp_reg.lword = 0;
1296 bp->rcv_xmt_reg.lword = 0;
1300 memset(bp->cons_block_virt, 0, sizeof(PI_CONSUMER_BLOCK));
1304 if (dfx_hw_port_ctrl_req(bp,
1307 bp->burst_size,
1310 printk("%s: Could not set adapter burst size!\n", bp->dev->name);
1321 if (dfx_hw_port_ctrl_req(bp,
1323 bp->cons_block_phys,
1327 printk("%s: Could not set consumer block address!\n", bp->dev->name);
1341 if (dfx_hw_port_ctrl_req(bp, PI_PCTRL_M_INIT,
1342 (u32)(bp->descr_block_phys |
1346 bp->dev->name);
1352 bp->cmd_req_virt->cmd_type = PI_CMD_K_CHARS_SET;
1353 bp->cmd_req_virt->char_set.item[0].item_code = PI_ITEM_K_FLUSH_TIME;
1354 bp->cmd_req_virt->char_set.item[0].value = 3; /* 3 seconds */
1355 bp->cmd_req_virt->char_set.item[0].item_index = 0;
1356 bp->cmd_req_virt->char_set.item[1].item_code = PI_ITEM_K_EOL;
1357 if (dfx_hw_dma_cmd_req(bp) != DFX_K_SUCCESS)
1359 printk("%s: DMA command request failed!\n", bp->dev->name);
1365 bp->cmd_req_virt->cmd_type = PI_CMD_K_SNMP_SET;
1366 bp->cmd_req_virt->snmp_set.item[0].item_code = PI_ITEM_K_FDX_ENB_DIS;
1367 bp->cmd_req_virt->snmp_set.item[0].value = bp->full_duplex_enb;
1368 bp->cmd_req_virt->snmp_set.item[0].item_index = 0;
1369 bp->cmd_req_virt->snmp_set.item[1].item_code = PI_ITEM_K_MAC_T_REQ;
1370 bp->cmd_req_virt->snmp_set.item[1].value = bp->req_ttrt;
1371 bp->cmd_req_virt->snmp_set.item[1].item_index = 0;
1372 bp->cmd_req_virt->snmp_set.item[2].item_code = PI_ITEM_K_EOL;
1373 if (dfx_hw_dma_cmd_req(bp) != DFX_K_SUCCESS)
1375 printk("%s: DMA command request failed!\n", bp->dev->name);
1381 if (dfx_ctl_update_cam(bp) != DFX_K_SUCCESS)
1383 printk("%s: Adapter CAM update failed!\n", bp->dev->name);
1389 if (dfx_ctl_update_filters(bp) != DFX_K_SUCCESS)
1391 printk("%s: Adapter filters update failed!\n", bp->dev->name);
1401 dfx_rcv_flush(bp);
1405 if (dfx_rcv_init(bp, get_buffers))
1407 printk("%s: Receive buffer allocation failed\n", bp->dev->name);
1409 dfx_rcv_flush(bp);
1415 bp->cmd_req_virt->cmd_type = PI_CMD_K_START;
1416 if (dfx_hw_dma_cmd_req(bp) != DFX_K_SUCCESS)
1418 printk("%s: Start command failed\n", bp->dev->name);
1420 dfx_rcv_flush(bp);
1426 dfx_port_write_long(bp, PI_PDQ_K_REG_HOST_INT_ENB, PI_HOST_INT_K_ENABLE_DEF_INTS);
1463 DFX_board_t *bp = netdev_priv(dev);
1488 memcpy(dev->dev_addr, bp->factory_mac_addr, FDDI_K_ALEN);
1492 memset(bp->uc_table, 0, sizeof(bp->uc_table));
1493 memset(bp->mc_table, 0, sizeof(bp->mc_table));
1494 bp->uc_count = 0;
1495 bp->mc_count = 0;
1499 bp->ind_group_prom = PI_FSTATE_K_BLOCK;
1500 bp->group_prom = PI_FSTATE_K_BLOCK;
1502 spin_lock_init(&bp->lock);
1506 bp->reset_type = PI_PDATA_A_RESET_M_SKIP_ST; /* skip self-test */
1507 if (dfx_adap_init(bp, 1) != DFX_K_SUCCESS)
1554 DFX_board_t *bp = netdev_priv(dev);
1560 dfx_port_write_long(bp, PI_PDQ_K_REG_HOST_INT_ENB, PI_HOST_INT_K_DISABLE_ALL_INTS);
1564 (void) dfx_hw_dma_uninit(bp, PI_PDATA_A_RESET_M_SKIP_ST);
1575 dfx_xmt_flush(bp);
1588 bp->cmd_req_reg.lword = 0;
1589 bp->cmd_rsp_reg.lword = 0;
1590 bp->rcv_xmt_reg.lword = 0;
1594 memset(bp->cons_block_virt, 0, sizeof(PI_CONSUMER_BLOCK));
1598 dfx_rcv_flush(bp);
1624 * bp - pointer to board information
1639 static void dfx_int_pr_halt_id(DFX_board_t *bp)
1646 dfx_port_read_long(bp, PI_PDQ_K_REG_PORT_STATUS, &port_status);
1654 printk("%s: Halt ID: Selftest Timeout\n", bp->dev->name);
1658 printk("%s: Halt ID: Host Bus Parity Error\n", bp->dev->name);
1662 printk("%s: Halt ID: Host-Directed Halt\n", bp->dev->name);
1666 printk("%s: Halt ID: Adapter Software Fault\n", bp->dev->name);
1670 printk("%s: Halt ID: Adapter Hardware Fault\n", bp->dev->name);
1674 printk("%s: Halt ID: FDDI Network PC Trace Path Test\n", bp->dev->name);
1678 printk("%s: Halt ID: Adapter DMA Error\n", bp->dev->name);
1682 printk("%s: Halt ID: Firmware Image CRC Error\n", bp->dev->name);
1686 printk("%s: Halt ID: 68000 Bus Exception\n", bp->dev->name);
1690 printk("%s: Halt ID: Unknown (code = %X)\n", bp->dev->name, halt_id);
1708 * bp - pointer to board information
1743 static void dfx_int_type_0_process(DFX_board_t *bp)
1755 dfx_port_read_long(bp, PI_PDQ_K_REG_TYPE_0_STATUS, &type_0_status);
1756 dfx_port_write_long(bp, PI_PDQ_K_REG_TYPE_0_STATUS, type_0_status);
1767 printk("%s: Non-Existent Memory Access Error\n", bp->dev->name);
1772 printk("%s: Packet Memory Parity Error\n", bp->dev->name);
1777 printk("%s: Host Bus Parity Error\n", bp->dev->name);
1781 bp->link_available = PI_K_FALSE; /* link is no longer available */
1782 bp->reset_type = 0; /* rerun on-board diagnostics */
1783 printk("%s: Resetting adapter...\n", bp->dev->name);
1784 if (dfx_adap_init(bp, 0) != DFX_K_SUCCESS)
1786 printk("%s: Adapter reset failed! Disabling adapter interrupts.\n", bp->dev->name);
1787 dfx_port_write_long(bp, PI_PDQ_K_REG_HOST_INT_ENB, PI_HOST_INT_K_DISABLE_ALL_INTS);
1790 printk("%s: Adapter reset successful!\n", bp->dev->name);
1800 bp->link_available = PI_K_FALSE; /* link is no longer available */
1801 dfx_xmt_flush(bp); /* flush any outstanding packets */
1802 (void) dfx_hw_port_ctrl_req(bp,
1815 state = dfx_hw_adap_state_rd(bp); /* get adapter state */
1824 printk("%s: Controller has transitioned to HALTED state!\n", bp->dev->name);
1825 dfx_int_pr_halt_id(bp); /* display halt id as string */
1829 bp->link_available = PI_K_FALSE; /* link is no longer available */
1830 bp->reset_type = 0; /* rerun on-board diagnostics */
1831 printk("%s: Resetting adapter...\n", bp->dev->name);
1832 if (dfx_adap_init(bp, 0) != DFX_K_SUCCESS)
1834 printk("%s: Adapter reset failed! Disabling adapter interrupts.\n", bp->dev->name);
1835 dfx_port_write_long(bp, PI_PDQ_K_REG_HOST_INT_ENB, PI_HOST_INT_K_DISABLE_ALL_INTS);
1838 printk("%s: Adapter reset successful!\n", bp->dev->name);
1842 bp->link_available = PI_K_TRUE; /* set link available flag */
1860 * bp - pointer to board information
1890 DFX_board_t *bp = netdev_priv(dev);
1895 if(dfx_xmt_done(bp)) /* free consumed xmt packets */
1900 dfx_rcv_queue_process(bp); /* service received LLC frames */
1909 dfx_port_write_long(bp, PI_PDQ_K_REG_TYPE_2_PROD, bp->rcv_xmt_reg.lword);
1913 dfx_port_read_long(bp, PI_PDQ_K_REG_PORT_STATUS, &port_status);
1918 dfx_int_type_0_process(bp); /* process Type 0 interrupts */
1961 DFX_board_t *bp = netdev_priv(dev);
1962 struct device *bdev = bp->bus_dev;
1972 dfx_port_read_long(bp, PFI_K_REG_STATUS, &status);
1976 spin_lock(&bp->lock);
1979 dfx_port_write_long(bp, PFI_K_REG_MODE_CTRL,
1986 dfx_port_write_long(bp, PFI_K_REG_STATUS,
1988 dfx_port_write_long(bp, PFI_K_REG_MODE_CTRL,
1992 spin_unlock(&bp->lock);
2002 spin_lock(&bp->lock);
2016 spin_unlock(&bp->lock);
2021 dfx_port_read_long(bp, PI_PDQ_K_REG_PORT_STATUS, &status);
2031 spin_lock(&bp->lock);
2036 spin_unlock(&bp->lock);
2088 DFX_board_t *bp = netdev_priv(dev);
2090 /* Fill the bp->stats structure with driver-maintained counters */
2092 bp->stats.gen.rx_packets = bp->rcv_total_frames;
2093 bp->stats.gen.tx_packets = bp->xmt_total_frames;
2094 bp->stats.gen.rx_bytes = bp->rcv_total_bytes;
2095 bp->stats.gen.tx_bytes = bp->xmt_total_bytes;
2096 bp->stats.gen.rx_errors = bp->rcv_crc_errors +
2097 bp->rcv_frame_status_errors +
2098 bp->rcv_length_errors;
2099 bp->stats.gen.tx_errors = bp->xmt_length_errors;
2100 bp->stats.gen.rx_dropped = bp->rcv_discards;
2101 bp->stats.gen.tx_dropped = bp->xmt_discards;
2102 bp->stats.gen.multicast = bp->rcv_multicast_frames;
2103 bp->stats.gen.collisions = 0; /* always zero (0) for FDDI */
2107 bp->cmd_req_virt->cmd_type = PI_CMD_K_SMT_MIB_GET;
2108 if (dfx_hw_dma_cmd_req(bp) != DFX_K_SUCCESS)
2109 return (struct net_device_stats *)&bp->stats;
2111 /* Fill the bp->stats structure with the SMT MIB object values */
2113 memcpy(bp->stats.smt_station_id, &bp->cmd_rsp_virt->smt_mib_get.smt_station_id, sizeof(bp->cmd_rsp_virt->smt_mib_get.smt_station_id));
2114 bp->stats.smt_op_version_id = bp->cmd_rsp_virt->smt_mib_get.smt_op_version_id;
2115 bp->stats.smt_hi_version_id = bp->cmd_rsp_virt->smt_mib_get.smt_hi_version_id;
2116 bp->stats.smt_lo_version_id = bp->cmd_rsp_virt->smt_mib_get.smt_lo_version_id;
2117 memcpy(bp->stats.smt_user_data, &bp->cmd_rsp_virt->smt_mib_get.smt_user_data, sizeof(bp->cmd_rsp_virt->smt_mib_get.smt_user_data));
2118 bp->stats.smt_mib_version_id = bp->cmd_rsp_virt->smt_mib_get.smt_mib_version_id;
2119 bp->stats.smt_mac_cts = bp->cmd_rsp_virt->smt_mib_get.smt_mac_ct;
2120 bp->stats.smt_non_master_cts = bp->cmd_rsp_virt->smt_mib_get.smt_non_master_ct;
2121 bp->stats.smt_master_cts = bp->cmd_rsp_virt->smt_mib_get.smt_master_ct;
2122 bp->stats.smt_available_paths = bp->cmd_rsp_virt->smt_mib_get.smt_available_paths;
2123 bp->stats.smt_config_capabilities = bp->cmd_rsp_virt->smt_mib_get.smt_config_capabilities;
2124 bp->stats.smt_config_policy = bp->cmd_rsp_virt->smt_mib_get.smt_config_policy;
2125 bp->stats.smt_connection_policy = bp->cmd_rsp_virt->smt_mib_get.smt_connection_policy;
2126 bp->stats.smt_t_notify = bp->cmd_rsp_virt->smt_mib_get.smt_t_notify;
2127 bp->stats.smt_stat_rpt_policy = bp->cmd_rsp_virt->smt_mib_get.smt_stat_rpt_policy;
2128 bp->stats.smt_trace_max_expiration = bp->cmd_rsp_virt->smt_mib_get.smt_trace_max_expiration;
2129 bp->stats.smt_bypass_present = bp->cmd_rsp_virt->smt_mib_get.smt_bypass_present;
2130 bp->stats.smt_ecm_state = bp->cmd_rsp_virt->smt_mib_get.smt_ecm_state;
2131 bp->stats.smt_cf_state = bp->cmd_rsp_virt->smt_mib_get.smt_cf_state;
2132 bp->stats.smt_remote_disconnect_flag = bp->cmd_rsp_virt->smt_mib_get.smt_remote_disconnect_flag;
2133 bp->stats.smt_station_status = bp->cmd_rsp_virt->smt_mib_get.smt_station_status;
2134 bp->stats.smt_peer_wrap_flag = bp->cmd_rsp_virt->smt_mib_get.smt_peer_wrap_flag;
2135 bp->stats.smt_time_stamp = bp->cmd_rsp_virt->smt_mib_get.smt_msg_time_stamp.ls;
2136 bp->stats.smt_transition_time_stamp = bp->cmd_rsp_virt->smt_mib_get.smt_transition_time_stamp.ls;
2137 bp->stats.mac_frame_status_functions = bp->cmd_rsp_virt->smt_mib_get.mac_frame_status_functions;
2138 bp->stats.mac_t_max_capability = bp->cmd_rsp_virt->smt_mib_get.mac_t_max_capability;
2139 bp->stats.mac_tvx_capability = bp->cmd_rsp_virt->smt_mib_get.mac_tvx_capability;
2140 bp->stats.mac_available_paths = bp->cmd_rsp_virt->smt_mib_get.mac_available_paths;
2141 bp->stats.mac_current_path = bp->cmd_rsp_virt->smt_mib_get.mac_current_path;
2142 memcpy(bp->stats.mac_upstream_nbr, &bp->cmd_rsp_virt->smt_mib_get.mac_upstream_nbr, FDDI_K_ALEN);
2143 memcpy(bp->stats.mac_downstream_nbr, &bp->cmd_rsp_virt->smt_mib_get.mac_downstream_nbr, FDDI_K_ALEN);
2144 memcpy(bp->stats.mac_old_upstream_nbr, &bp->cmd_rsp_virt->smt_mib_get.mac_old_upstream_nbr, FDDI_K_ALEN);
2145 memcpy(bp->stats.mac_old_downstream_nbr, &bp->cmd_rsp_virt->smt_mib_get.mac_old_downstream_nbr, FDDI_K_ALEN);
2146 bp->stats.mac_dup_address_test = bp->cmd_rsp_virt->smt_mib_get.mac_dup_address_test;
2147 bp->stats.mac_requested_paths = bp->cmd_rsp_virt->smt_mib_get.mac_requested_paths;
2148 bp->stats.mac_downstream_port_type = bp->cmd_rsp_virt->smt_mib_get.mac_downstream_port_type;
2149 memcpy(bp->stats.mac_smt_address, &bp->cmd_rsp_virt->smt_mib_get.mac_smt_address, FDDI_K_ALEN);
2150 bp->stats.mac_t_req = bp->cmd_rsp_virt->smt_mib_get.mac_t_req;
2151 bp->stats.mac_t_neg = bp->cmd_rsp_virt->smt_mib_get.mac_t_neg;
2152 bp->stats.mac_t_max = bp->cmd_rsp_virt->smt_mib_get.mac_t_max;
2153 bp->stats.mac_tvx_value = bp->cmd_rsp_virt->smt_mib_get.mac_tvx_value;
2154 bp->stats.mac_frame_error_threshold = bp->cmd_rsp_virt->smt_mib_get.mac_frame_error_threshold;
2155 bp->stats.mac_frame_error_ratio = bp->cmd_rsp_virt->smt_mib_get.mac_frame_error_ratio;
2156 bp->stats.mac_rmt_state = bp->cmd_rsp_virt->smt_mib_get.mac_rmt_state;
2157 bp->stats.mac_da_flag = bp->cmd_rsp_virt->smt_mib_get.mac_da_flag;
2158 bp->stats.mac_una_da_flag = bp->cmd_rsp_virt->smt_mib_get.mac_unda_flag;
2159 bp->stats.mac_frame_error_flag = bp->cmd_rsp_virt->smt_mib_get.mac_frame_error_flag;
2160 bp->stats.mac_ma_unitdata_available = bp->cmd_rsp_virt->smt_mib_get.mac_ma_unitdata_available;
2161 bp->stats.mac_hardware_present = bp->cmd_rsp_virt->smt_mib_get.mac_hardware_present;
2162 bp->stats.mac_ma_unitdata_enable = bp->cmd_rsp_virt->smt_mib_get.mac_ma_unitdata_enable;
2163 bp->stats.path_tvx_lower_bound = bp->cmd_rsp_virt->smt_mib_get.path_tvx_lower_bound;
2164 bp->stats.path_t_max_lower_bound = bp->cmd_rsp_virt->smt_mib_get.path_t_max_lower_bound;
2165 bp->stats.path_max_t_req = bp->cmd_rsp_virt->smt_mib_get.path_max_t_req;
2166 memcpy(bp->stats.path_configuration, &bp->cmd_rsp_virt->smt_mib_get.path_configuration, sizeof(bp->cmd_rsp_virt->smt_mib_get.path_configuration));
2167 bp->stats.port_my_type[0] = bp->cmd_rsp_virt->smt_mib_get.port_my_type[0];
2168 bp->stats.port_my_type[1] = bp->cmd_rsp_virt->smt_mib_get.port_my_type[1];
2169 bp->stats.port_neighbor_type[0] = bp->cmd_rsp_virt->smt_mib_get.port_neighbor_type[0];
2170 bp->stats.port_neighbor_type[1] = bp->cmd_rsp_virt->smt_mib_get.port_neighbor_type[1];
2171 bp->stats.port_connection_policies[0] = bp->cmd_rsp_virt->smt_mib_get.port_connection_policies[0];
2172 bp->stats.port_connection_policies[1] = bp->cmd_rsp_virt->smt_mib_get.port_connection_policies[1];
2173 bp->stats.port_mac_indicated[0] = bp->cmd_rsp_virt->smt_mib_get.port_mac_indicated[0];
2174 bp->stats.port_mac_indicated[1] = bp->cmd_rsp_virt->smt_mib_get.port_mac_indicated[1];
2175 bp->stats.port_current_path[0] = bp->cmd_rsp_virt->smt_mib_get.port_current_path[0];
2176 bp->stats.port_current_path[1] = bp->cmd_rsp_virt->smt_mib_get.port_current_path[1];
2177 memcpy(&bp->stats.port_requested_paths[0*3], &bp->cmd_rsp_virt->smt_mib_get.port_requested_paths[0], 3);
2178 memcpy(&bp->stats.port_requested_paths[1*3], &bp->cmd_rsp_virt->smt_mib_get.port_requested_paths[1], 3);
2179 bp->stats.port_mac_placement[0] = bp->cmd_rsp_virt->smt_mib_get.port_mac_placement[0];
2180 bp->stats.port_mac_placement[1] = bp->cmd_rsp_virt->smt_mib_get.port_mac_placement[1];
2181 bp->stats.port_available_paths[0] = bp->cmd_rsp_virt->smt_mib_get.port_available_paths[0];
2182 bp->stats.port_available_paths[1] = bp->cmd_rsp_virt->smt_mib_get.port_available_paths[1];
2183 bp->stats.port_pmd_class[0] = bp->cmd_rsp_virt->smt_mib_get.port_pmd_class[0];
2184 bp->stats.port_pmd_class[1] = bp->cmd_rsp_virt->smt_mib_get.port_pmd_class[1];
2185 bp->stats.port_connection_capabilities[0] = bp->cmd_rsp_virt->smt_mib_get.port_connection_capabilities[0];
2186 bp->stats.port_connection_capabilities[1] = bp->cmd_rsp_virt->smt_mib_get.port_connection_capabilities[1];
2187 bp->stats.port_bs_flag[0] = bp->cmd_rsp_virt->smt_mib_get.port_bs_flag[0];
2188 bp->stats.port_bs_flag[1] = bp->cmd_rsp_virt->smt_mib_get.port_bs_flag[1];
2189 bp->stats.port_ler_estimate[0] = bp->cmd_rsp_virt->smt_mib_get.port_ler_estimate[0];
2190 bp->stats.port_ler_estimate[1] = bp->cmd_rsp_virt->smt_mib_get.port_ler_estimate[1];
2191 bp->stats.port_ler_cutoff[0] = bp->cmd_rsp_virt->smt_mib_get.port_ler_cutoff[0];
2192 bp->stats.port_ler_cutoff[1] = bp->cmd_rsp_virt->smt_mib_get.port_ler_cutoff[1];
2193 bp->stats.port_ler_alarm[0] = bp->cmd_rsp_virt->smt_mib_get.port_ler_alarm[0];
2194 bp->stats.port_ler_alarm[1] = bp->cmd_rsp_virt->smt_mib_get.port_ler_alarm[1];
2195 bp->stats.port_connect_state[0] = bp->cmd_rsp_virt->smt_mib_get.port_connect_state[0];
2196 bp->stats.port_connect_state[1] = bp->cmd_rsp_virt->smt_mib_get.port_connect_state[1];
2197 bp->stats.port_pcm_state[0] = bp->cmd_rsp_virt->smt_mib_get.port_pcm_state[0];
2198 bp->stats.port_pcm_state[1] = bp->cmd_rsp_virt->smt_mib_get.port_pcm_state[1];
2199 bp->stats.port_pc_withhold[0] = bp->cmd_rsp_virt->smt_mib_get.port_pc_withhold[0];
2200 bp->stats.port_pc_withhold[1] = bp->cmd_rsp_virt->smt_mib_get.port_pc_withhold[1];
2201 bp->stats.port_ler_flag[0] = bp->cmd_rsp_virt->smt_mib_get.port_ler_flag[0];
2202 bp->stats.port_ler_flag[1] = bp->cmd_rsp_virt->smt_mib_get.port_ler_flag[1];
2203 bp->stats.port_hardware_present[0] = bp->cmd_rsp_virt->smt_mib_get.port_hardware_present[0];
2204 bp->stats.port_hardware_present[1] = bp->cmd_rsp_virt->smt_mib_get.port_hardware_present[1];
2208 bp->cmd_req_virt->cmd_type = PI_CMD_K_CNTRS_GET;
2209 if (dfx_hw_dma_cmd_req(bp) != DFX_K_SUCCESS)
2210 return (struct net_device_stats *)&bp->stats;
2212 /* Fill the bp->stats structure with the FDDI counter values */
2214 bp->stats.mac_frame_cts = bp->cmd_rsp_virt->cntrs_get.cntrs.frame_cnt.ls;
2215 bp->stats.mac_copied_cts = bp->cmd_rsp_virt->cntrs_get.cntrs.copied_cnt.ls;
2216 bp->stats.mac_transmit_cts = bp->cmd_rsp_virt->cntrs_get.cntrs.transmit_cnt.ls;
2217 bp->stats.mac_error_cts = bp->cmd_rsp_virt->cntrs_get.cntrs.error_cnt.ls;
2218 bp->stats.mac_lost_cts = bp->cmd_rsp_virt->cntrs_get.cntrs.lost_cnt.ls;
2219 bp->stats.port_lct_fail_cts[0] = bp->cmd_rsp_virt->cntrs_get.cntrs.lct_rejects[0].ls;
2220 bp->stats.port_lct_fail_cts[1] = bp->cmd_rsp_virt->cntrs_get.cntrs.lct_rejects[1].ls;
2221 bp->stats.port_lem_reject_cts[0] = bp->cmd_rsp_virt->cntrs_get.cntrs.lem_rejects[0].ls;
2222 bp->stats.port_lem_reject_cts[1] = bp->cmd_rsp_virt->cntrs_get.cntrs.lem_rejects[1].ls;
2223 bp->stats.port_lem_cts[0] = bp->cmd_rsp_virt->cntrs_get.cntrs.link_errors[0].ls;
2224 bp->stats.port_lem_cts[1] = bp->cmd_rsp_virt->cntrs_get.cntrs.link_errors[1].ls;
2226 return (struct net_device_stats *)&bp->stats;
2275 DFX_board_t *bp = netdev_priv(dev);
2282 bp->ind_group_prom = PI_FSTATE_K_PASS; /* Enable LLC ind/group prom mode */
2288 bp->ind_group_prom = PI_FSTATE_K_BLOCK; /* Disable LLC ind/group prom mode */
2309 if (netdev_mc_count(dev) > (PI_CMD_ADDR_FILTER_K_SIZE - bp->uc_count))
2311 bp->group_prom = PI_FSTATE_K_PASS; /* Enable LLC group prom mode */
2312 bp->mc_count = 0; /* Don't add mc addrs to CAM */
2316 bp->group_prom = PI_FSTATE_K_BLOCK; /* Disable LLC group prom mode */
2317 bp->mc_count = netdev_mc_count(dev); /* Add mc addrs to CAM */
2324 memcpy(&bp->mc_table[i++ * FDDI_K_ALEN],
2327 if (dfx_ctl_update_cam(bp) != DFX_K_SUCCESS)
2333 DBG_printk("%s: Multicast address table updated! Added %d addresses.\n", dev->name, bp->mc_count);
2339 if (dfx_ctl_update_filters(bp) != DFX_K_SUCCESS)
2389 DFX_board_t *bp = netdev_priv(dev);
2394 memcpy(&bp->uc_table[0], p_sockaddr->sa_data, FDDI_K_ALEN); /* update driver struct */
2395 bp->uc_count = 1;
2409 if ((bp->uc_count + bp->mc_count) > PI_CMD_ADDR_FILTER_K_SIZE)
2411 bp->group_prom = PI_FSTATE_K_PASS; /* Enable LLC group prom mode */
2412 bp->mc_count = 0; /* Don't add mc addrs to CAM */
2416 if (dfx_ctl_update_filters(bp) != DFX_K_SUCCESS)
2428 if (dfx_ctl_update_cam(bp) != DFX_K_SUCCESS)
2453 * bp - pointer to board information
2473 static int dfx_ctl_update_cam(DFX_board_t *bp)
2491 memset(bp->cmd_req_virt, 0, PI_CMD_REQ_K_SIZE_MAX); /* first clear buffer */
2492 bp->cmd_req_virt->cmd_type = PI_CMD_K_ADDR_FILTER_SET;
2493 p_addr = &bp->cmd_req_virt->addr_filter_set.entry[0];
2497 for (i=0; i < (int)bp->uc_count; i++)
2501 memcpy(p_addr, &bp->uc_table[i*FDDI_K_ALEN], FDDI_K_ALEN);
2508 for (i=0; i < (int)bp->mc_count; i++)
2510 if ((i + bp->uc_count) < PI_CMD_ADDR_FILTER_K_SIZE)
2512 memcpy(p_addr, &bp->mc_table[i*FDDI_K_ALEN], FDDI_K_ALEN);
2519 if (dfx_hw_dma_cmd_req(bp) != DFX_K_SUCCESS)
2538 * bp - pointer to board information
2556 static int dfx_ctl_update_filters(DFX_board_t *bp)
2562 bp->cmd_req_virt->cmd_type = PI_CMD_K_FILTERS_SET;
2566 bp->cmd_req_virt->filter_set.item[i].item_code = PI_ITEM_K_BROADCAST;
2567 bp->cmd_req_virt->filter_set.item[i++].value = PI_FSTATE_K_PASS;
2571 bp->cmd_req_virt->filter_set.item[i].item_code = PI_ITEM_K_IND_GROUP_PROM;
2572 bp->cmd_req_virt->filter_set.item[i++].value = bp->ind_group_prom;
2576 bp->cmd_req_virt->filter_set.item[i].item_code = PI_ITEM_K_GROUP_PROM;
2577 bp->cmd_req_virt->filter_set.item[i++].value = bp->group_prom;
2581 bp->cmd_req_virt->filter_set.item[i].item_code = PI_ITEM_K_EOL;
2585 if (dfx_hw_dma_cmd_req(bp) != DFX_K_SUCCESS)
2603 * bp - pointer to board information
2631 static int dfx_hw_dma_cmd_req(DFX_board_t *bp)
2638 status = dfx_hw_adap_state_rd(bp);
2647 bp->descr_block_virt->cmd_rsp[bp->cmd_rsp_reg.index.prod].long_0 = (u32) (PI_RCV_DESCR_M_SOP |
2649 bp->descr_block_virt->cmd_rsp[bp->cmd_rsp_reg.index.prod].long_1 = bp->cmd_rsp_phys;
2653 bp->cmd_rsp_reg.index.prod += 1;
2654 bp->cmd_rsp_reg.index.prod &= PI_CMD_RSP_K_NUM_ENTRIES-1;
2655 dfx_port_write_long(bp, PI_PDQ_K_REG_CMD_RSP_PROD, bp->cmd_rsp_reg.lword);
2659 bp->descr_block_virt->cmd_req[bp->cmd_req_reg.index.prod].long_0 = (u32) (PI_XMT_DESCR_M_SOP |
2661 bp->descr_block_virt->cmd_req[bp->cmd_req_reg.index.prod].long_1 = bp->cmd_req_phys;
2665 bp->cmd_req_reg.index.prod += 1;
2666 bp->cmd_req_reg.index.prod &= PI_CMD_REQ_K_NUM_ENTRIES-1;
2667 dfx_port_write_long(bp, PI_PDQ_K_REG_CMD_REQ_PROD, bp->cmd_req_reg.lword);
2676 if (bp->cmd_req_reg.index.prod == (u8)(bp->cons_block_virt->cmd_req))
2685 bp->cmd_req_reg.index.comp += 1;
2686 bp->cmd_req_reg.index.comp &= PI_CMD_REQ_K_NUM_ENTRIES-1;
2687 dfx_port_write_long(bp, PI_PDQ_K_REG_CMD_REQ_PROD, bp->cmd_req_reg.lword);
2696 if (bp->cmd_rsp_reg.index.prod == (u8)(bp->cons_block_virt->cmd_rsp))
2705 bp->cmd_rsp_reg.index.comp += 1;
2706 bp->cmd_rsp_reg.index.comp &= PI_CMD_RSP_K_NUM_ENTRIES-1;
2707 dfx_port_write_long(bp, PI_PDQ_K_REG_CMD_RSP_PROD, bp->cmd_rsp_reg.lword);
2724 * bp - pointer to board information
2746 DFX_board_t *bp,
2763 dfx_port_write_long(bp, PI_PDQ_K_REG_PORT_DATA_A, data_a);
2764 dfx_port_write_long(bp, PI_PDQ_K_REG_PORT_DATA_B, data_b);
2765 dfx_port_write_long(bp, PI_PDQ_K_REG_PORT_CTRL, port_cmd);
2776 dfx_port_read_long(bp, PI_PDQ_K_REG_PORT_CTRL, &port_cmd);
2791 dfx_port_read_long(bp, PI_PDQ_K_REG_HOST_DATA, host_data);
2808 * bp - pointer to board information
2830 DFX_board_t *bp,
2837 dfx_port_write_long(bp, PI_PDQ_K_REG_PORT_DATA_A, type); /* tell adapter type of reset */
2838 dfx_port_write_long(bp, PI_PDQ_K_REG_PORT_RESET, PI_RESET_M_ASSERT_RESET);
2846 dfx_port_write_long(bp, PI_PDQ_K_REG_PORT_RESET, 0);
2862 * bp - pointer to board information
2877 static int dfx_hw_adap_state_rd(DFX_board_t *bp)
2881 dfx_port_read_long(bp, PI_PDQ_K_REG_PORT_STATUS, &port_status);
2898 * bp - pointer to board information
2917 static int dfx_hw_dma_uninit(DFX_board_t *bp, PI_UINT32 type)
2923 dfx_hw_adap_reset(bp, type);
2929 if (dfx_hw_adap_state_rd(bp) == PI_STATE_K_DMA_UNAVAIL)
2966 * bp - pointer to board information
2989 static int dfx_rcv_init(DFX_board_t *bp, int get_buffers)
3013 for (i = 0; i < (int)(bp->rcv_bufs_to_post); i++)
3014 for (j = 0; (i + j) < (int)PI_RCV_DATA_K_NUM_ENTRIES; j += bp->rcv_bufs_to_post)
3019 newskb = __netdev_alloc_skb(bp->dev, NEW_SKB_SIZE,
3029 dma_addr = dma_map_single(bp->bus_dev,
3033 if (dma_mapping_error(bp->bus_dev, dma_addr)) {
3037 bp->descr_block_virt->rcv_data[i + j].long_0 =
3042 bp->descr_block_virt->rcv_data[i + j].long_1 =
3049 bp->p_rcv_buff_va[i+j] = (char *) newskb;
3052 for (i=0; i < (int)(bp->rcv_bufs_to_post); i++)
3053 for (j=0; (i + j) < (int)PI_RCV_DATA_K_NUM_ENTRIES; j += bp->rcv_bufs_to_post)
3055 bp->descr_block_virt->rcv_data[i+j].long_0 = (u32) (PI_RCV_DESCR_M_SOP |
3057 bp->descr_block_virt->rcv_data[i+j].long_1 = (u32) (bp->rcv_block_phys + (i * PI_RCV_DATA_K_SIZE_MAX));
3058 bp->p_rcv_buff_va[i+j] = (bp->rcv_block_virt + (i * PI_RCV_DATA_K_SIZE_MAX));
3065 bp->rcv_xmt_reg.index.rcv_prod = bp->rcv_bufs_to_post;
3066 dfx_port_write_long(bp, PI_PDQ_K_REG_TYPE_2_PROD, bp->rcv_xmt_reg.lword);
3083 * bp - pointer to board information
3104 DFX_board_t *bp
3115 p_type_2_cons = (PI_TYPE_2_CONSUMER *)(&bp->cons_block_virt->xmt_rcv_data);
3116 while (bp->rcv_xmt_reg.index.rcv_comp != p_type_2_cons->index.rcv_cons)
3122 entry = bp->rcv_xmt_reg.index.rcv_comp;
3124 p_buff = (char *) (((struct sk_buff *)bp->p_rcv_buff_va[entry])->data);
3126 p_buff = bp->p_rcv_buff_va[entry];
3128 dma_addr = bp->descr_block_virt->rcv_data[entry].long_1;
3129 dma_sync_single_for_cpu(bp->bus_dev,
3138 bp->rcv_crc_errors++;
3140 bp->rcv_frame_status_errors++;
3151 bp->rcv_length_errors++;
3159 newskb = netdev_alloc_skb(bp->dev,
3164 bp->bus_dev,
3169 bp->bus_dev,
3178 skb = (struct sk_buff *)bp->p_rcv_buff_va[entry];
3179 dma_unmap_single(bp->bus_dev,
3184 bp->p_rcv_buff_va[entry] = (char *)newskb;
3185 bp->descr_block_virt->rcv_data[entry].long_1 = (u32)new_dma_addr;
3192 skb = netdev_alloc_skb(bp->dev,
3196 printk("%s: Could not allocate receive buffer. Dropping packet.\n", bp->dev->name);
3197 bp->rcv_discards++;
3204 bp->bus_dev,
3217 skb->protocol = fddi_type_trans(skb, bp->dev);
3218 bp->rcv_total_bytes += skb->len;
3222 bp->rcv_total_frames++;
3224 bp->rcv_multicast_frames++;
3237 bp->rcv_xmt_reg.index.rcv_prod += 1;
3238 bp->rcv_xmt_reg.index.rcv_comp += 1;
3307 DFX_board_t *bp = netdev_priv(dev);
3329 bp->xmt_length_errors++; /* bump error counter */
3346 if (bp->link_available == PI_K_FALSE)
3348 if (dfx_hw_adap_state_rd(bp) == PI_STATE_K_LINK_AVAIL) /* is link really available? */
3349 bp->link_available = PI_K_TRUE; /* if so, set flag and continue */
3352 bp->xmt_discards++; /* bump error counter */
3366 dma_addr = dma_map_single(bp->bus_dev, skb->data, skb->len,
3368 if (dma_mapping_error(bp->bus_dev, dma_addr)) {
3373 spin_lock_irqsave(&bp->lock, flags);
3377 prod = bp->rcv_xmt_reg.index.xmt_prod;
3378 p_xmt_descr = &(bp->descr_block_virt->xmt_data[prod]);
3391 p_xmt_drv_descr = &(bp->xmt_drv_descr_blk[prod++]); /* also bump producer index */
3434 if (prod == bp->rcv_xmt_reg.index.xmt_comp)
3437 spin_unlock_irqrestore(&bp->lock, flags);
3461 bp->rcv_xmt_reg.index.xmt_prod = prod;
3462 dfx_port_write_long(bp, PI_PDQ_K_REG_TYPE_2_PROD, bp->rcv_xmt_reg.lword);
3463 spin_unlock_irqrestore(&bp->lock, flags);
3481 * bp - pointer to board information
3501 static int dfx_xmt_done(DFX_board_t *bp)
3510 p_type_2_cons = (PI_TYPE_2_CONSUMER *)(&bp->cons_block_virt->xmt_rcv_data);
3511 while (bp->rcv_xmt_reg.index.xmt_comp != p_type_2_cons->index.xmt_cons)
3515 p_xmt_drv_descr = &(bp->xmt_drv_descr_blk[bp->rcv_xmt_reg.index.xmt_comp]);
3519 bp->xmt_total_frames++;
3520 bp->xmt_total_bytes += p_xmt_drv_descr->p_skb->len;
3523 comp = bp->rcv_xmt_reg.index.xmt_comp;
3524 dma_unmap_single(bp->bus_dev,
3525 bp->descr_block_virt->xmt_data[comp].long_1,
3541 bp->rcv_xmt_reg.index.xmt_comp += 1;
3560 * bp - pointer to board information
3575 static void dfx_rcv_flush( DFX_board_t *bp )
3579 for (i = 0; i < (int)(bp->rcv_bufs_to_post); i++)
3580 for (j = 0; (i + j) < (int)PI_RCV_DATA_K_NUM_ENTRIES; j += bp->rcv_bufs_to_post)
3583 skb = (struct sk_buff *)bp->p_rcv_buff_va[i+j];
3585 dma_unmap_single(bp->bus_dev,
3586 bp->descr_block_virt->rcv_data[i+j].long_1,
3591 bp->p_rcv_buff_va[i+j] = NULL;
3610 * bp - pointer to board information
3633 static void dfx_xmt_flush( DFX_board_t *bp )
3641 while (bp->rcv_xmt_reg.index.xmt_comp != bp->rcv_xmt_reg.index.xmt_prod)
3645 p_xmt_drv_descr = &(bp->xmt_drv_descr_blk[bp->rcv_xmt_reg.index.xmt_comp]);
3648 comp = bp->rcv_xmt_reg.index.xmt_comp;
3649 dma_unmap_single(bp->bus_dev,
3650 bp->descr_block_virt->xmt_data[comp].long_1,
3657 bp->xmt_discards++;
3670 bp->rcv_xmt_reg.index.xmt_comp += 1;
3675 prod_cons = (u32)(bp->cons_block_virt->xmt_rcv_data & ~PI_CONS_M_XMT_INDEX);
3676 prod_cons |= (u32)(bp->rcv_xmt_reg.index.xmt_prod << PI_CONS_V_XMT_INDEX);
3677 bp->cons_block_virt->xmt_rcv_data = prod_cons;
3709 DFX_board_t *bp = netdev_priv(dev);
3722 (bp->rcv_bufs_to_post * PI_RCV_DATA_K_SIZE_MAX) +
3726 if (bp->kmalloced)
3728 bp->kmalloced, bp->kmalloced_dma);
3738 iounmap(bp->base.mem);