> +void netxen_delay(int value) > +{ > + unsigned long remainder; > + > + remainder = value / 50000; > + do { > + if (remainder > 1000) { > + udelay(1000); > + remainder -= 1000; > + } else { > + udelay(remainder + 1); > + remainder = 0; > + } > + } while (remainder > 0); > +} > +
Defined, but never used. Why not just use mdelay if you really are waiting that long? + + +/** + * netxen_niu_gbe_set_mii_mode- Set 10/100 Mbit Mode for GbE MAC + * + **/ +void netxen_niu_gbe_set_mii_mode(struct netxen_adapter *adapter, + long port, long enable) +{ + netxen_crb_writelit_adapter(adapter, NETXEN_NIU_MODE, 0x2); + netxen_crb_writelit_adapter(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port), + 0x80000000); + netxen_crb_writelit_adapter(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port), + 0x0000f0025); + netxen_crb_writelit_adapter(adapter, NETXEN_NIU_GB_MAC_CONFIG_1(port), + 0xf1ff); + netxen_crb_writelit_adapter(adapter, + NETXEN_NIU_GB0_GMII_MODE + (port << 3), 0); + netxen_crb_writelit_adapter(adapter, + NETXEN_NIU_GB0_MII_MODE + (port << 3), 1); + netxen_crb_writelit_adapter(adapter, + (NETXEN_NIU_GB0_HALF_DUPLEX + port * 4), 0); + netxen_crb_writelit_adapter(adapter, + NETXEN_NIU_GB_MII_MGMT_CONFIG(port), 0x7); + + if (enable) { + /* + * Do NOT enable flow control until a suitable solution for + * shutting down pause frames is found. + */ + netxen_crb_writelit_adapter(adapter, + NETXEN_NIU_GB_MAC_CONFIG_0(port), + 0x5); + } + > > + if (netxen_niu_gbe_enable_phy_interrupts(adapter, port)) > + printk("<1>ERROR enabling PHY interrupts\n"); Please use KERN_ERR not <1> > + if (netxen_niu_gbe_clear_phy_interrupts(adapter, port)) > + printk("<1>ERROR clearing PHY interrupts\n"); > +} > + > +long netxen_niu_gbe_init_port(struct netxen_adapter *adapter, long port) > +{ > + long result = 0; > + struct netxen_niu_phy_status status; > + > + if (0 == > + netxen_niu_gbe_phy_read(adapter, port, > + NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, > + (netxen_crbword_t *) & status)) { You seem to like the style: if (0 == foo()) It is not the current kernel fashion, but I'm okay with it. > + if (status.link) { > + if (status.speed == 2) { > + netxen_niu_gbe_set_gmii_mode(adapter, port, 1); > + } else if ((status.speed == 1) || (status.speed == 0)) { > + netxen_niu_gbe_set_mii_mode(adapter, port, 1); > + } else { > + result = -1; > + } > + > + } else { > + /* We don't have link. Cable must be unconnected. */ > + /* Enable phy interrupts so we take action when plugged > in */ > + netxen_crb_writelit_adapter(adapter, > + NETXEN_NIU_GB_MAC_CONFIG_0 > + (port), 0x80000000); > + netxen_crb_writelit_adapter(adapter, > + NETXEN_NIU_GB_MAC_CONFIG_0 > + (port), 0x0000f0025); > + if (netxen_niu_gbe_clear_phy_interrupts(adapter, port)) > + printk("<1>ERROR clearing PHY interrupts\n"); > + if (netxen_niu_gbe_enable_phy_interrupts(adapter, port)) > + printk("<1>ERROR enabling PHY interrupts\n"); > + if (netxen_niu_gbe_clear_phy_interrupts(adapter, port)) > + printk("<1>ERROR clearing PHY interrupts\n"); > + result = -1; > + } > + } else { > + result = -1; > + } > + return result; > +} Wouldn't this just be clearer with: long netxen_niu_gbe_init_port(struct netxen_adapter *adapter, long port) { int err; struct netxen_niu_phy_status status; err = netxen_niu_gbe_phy_read(adapter, port, NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, (netxen_crbword_t *) & status); if (err) return err; if (status.link) { if (status.speed == 2) netxen_niu_gbe_set_gmii_mode(adapter, port, 1); else if ((status.speed == 1) || (status.speed == 0)) netxen_niu_gbe_set_mii_mode(adapter, port, 1); else return -EINVAL; return 0; } /* We don't have link. Cable must be unconnected. */ /* Enable phy interrupts so we take action when plugged in */ netxen_crb_writelit_adapter(adapter, NETXEN_NIU_GB_MAC_CONFIG_0 (port), 0x80000000); netxen_crb_writelit_adapter(adapter, NETXEN_NIU_GB_MAC_CONFIG_0 (port), 0x0000f0025); if (netxen_niu_gbe_clear_phy_interrupts(adapter, port)) printk(KERN_ERR PFX "error clearing PHY interrupts\n"); if (netxen_niu_gbe_enable_phy_interrupts(adapter, port)) printk(KERN_ERR PFX "error enabling PHY interrupts\n"); if (netxen_niu_gbe_clear_phy_interrupts(adapter, port)) printk(KERN_ERR PFX "error clearing PHY interrupts\n"); return -ENOTCONNECTED; } > + > +/** > + * netxen_niu_gbe_handle_phy_interrupt - Handles GbE PHY interrupts > + * @param enable 0 means don't enable the port > + * 1 means enable (or re-enable) the port > + **/ > +long netxen_niu_gbe_handle_phy_interrupt(struct netxen_adapter *adapter, > + long port, long enable) > +{ > + long result = 0; > + struct netxen_niu_phy_interrupt int_src; > + > + printk > + ("<1>NETXEN: Handling PHY interrupt on port %d (device enable = > %d)\n", > + (int)port, (int)enable); > + > + /* The read of the PHY INT status will clear the pending interrupt > status */ > + if (netxen_niu_gbe_phy_read(adapter, port, > + NETXEN_NIU_GB_MII_MGMT_ADDR_INT_STATUS, > + (netxen_crbword_t *) & int_src) != 0) > + result = -1; > + else { > + printk("<1>PHY Interrupt source = 0x%x \n", *(u32 *) & int_src); These are debug messages, not a KERN_CRITICAL message.. > + if (int_src.jabber) > + printk("<1>jabber Interrupt "); > + if (int_src.polarity_changed) > + printk("<1>polarity changed "); > + if (int_src.energy_detect) > + printk("<1>energy detect \n"); > + if (int_src.downshift) > + printk("<1>downshift \n"); > + if (int_src.mdi_xover_changed) > + printk("<1>mdi_xover_changed "); > + if (int_src.fifo_over_underflow) > + printk("<1>fifo_over_underflow "); > + if (int_src.false_carrier) > + printk("<1>false_carrier "); > + if (int_src.symbol_error) > + printk("<1>symbol_error "); > + if (int_src.autoneg_completed) > + printk("<1>autoneg_completed "); > + if (int_src.page_received) > + printk("<1>page_received "); > + if (int_src.duplex_changed) > + printk("<1>duplex_changed "); > + if (int_src.autoneg_error) > + printk("<1>autoneg_error "); > + if ((int_src.speed_changed) || (int_src.link_status_changed)) { > + struct netxen_niu_phy_status status; > + > + printk("<1>speed_changed or link status changed"); > + if (netxen_niu_gbe_phy_read(adapter, port, > + > NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, > + (netxen_crbword_t *) & > + status) == 0) { > + printk("<1>\n"); > + if (status.speed == 2) { > + printk > + ("<1>Link speed changed to 1000 > Mbps\n"); > + netxen_niu_gbe_set_gmii_mode(adapter, > + port, > + enable); > + } else if (status.speed == 1) { > + printk > + ("<1>Link speed changed to 100 > Mbps\n"); > + netxen_niu_gbe_set_mii_mode(adapter, > + port, > + enable); > + } else if (status.speed == 0) { > + printk > + ("<1>Link speed changed to 10 > Mbps\n"); > + netxen_niu_gbe_set_mii_mode(adapter, > + port, > + enable); > + } else { > + printk > + ("<1>ERROR reading PHY status. > Illegal speed.\n"); > + result = -1; > + } > + } else { > + printk("<1>ERROR reading PHY status.\n"); > + result = -1; > + } > + > + } > + printk("<1>\n"); > + } > + return result; > +} > + > +/** > + * Return the current station MAC address. > + * Note that the passed-in value must already be in network byte order. > + **/ > +int netxen_niu_macaddr_get(struct netxen_adapter *adapter, > + int phy, netxen_ethernet_macaddr_t * addr) > +{ > + u64 result = 0; > + struct netxen_niu_gb_station_address_high stationhigh; > + struct netxen_niu_gb_station_address_low stationlow; > + > + if (addr == NULL) > + return -1; > + if ((phy < 0) || (phy > 3)) > + return -1; > + > + if (netxen_nic_hw_read_wx(adapter, NETXEN_NIU_GB_STATION_ADDR_0(phy), > + &stationhigh, 4)) > + return -1; > + if (netxen_nic_hw_read_wx(adapter, NETXEN_NIU_GB_STATION_ADDR_1(phy), > + &stationlow, 4)) > + return -1; > + > + result = (u64) stationlow.address; > + result |= (u64) stationhigh.address << 16; > + memcpy(*addr, &result, sizeof(netxen_ethernet_macaddr_t)); > + > + return 0; > +} > + > +/** > + * Set the station MAC address. > + * Note that the passed-in value must already be in network byte order. > + **/ > +int netxen_niu_macaddr_set(struct netxen_adapter *adapter, int phy, > + netxen_ethernet_macaddr_t addr) > +{ > + netxen_crbword_t temp = 0; > + > + if ((phy < 0) || (phy > 3)) > + return -1; > + > + memcpy(&temp, addr, 2); > + temp <<= 16; > + if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_STATION_ADDR_1(phy), > + &temp, 4)) > + return -1; > + > + temp = 0; > + > + memcpy(&temp, ((u8 *) addr) + 2, sizeof(netxen_crbword_t)); > + if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_STATION_ADDR_0(phy), > + &temp, 4)) > + return -2; Please use -ERRNO style returns. > + > + return 0; > +} > + > +/* Enable a GbE interface */ > +long netxen_niu_enable_gbe_port(struct netxen_adapter *adapter, > + long port, netxen_niu_gbe_ifmode_t mode) > +{ > + struct netxen_niu_gb_mac_config_0_t mac_cfg0; > + struct netxen_niu_gb_mac_config_1_t mac_cfg1; > + struct netxen_niu_gb_mii_mgmt_config mii_cfg; > + > + if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS)) > + return -1; > + > + *(netxen_crbword_t *) & mac_cfg0 = 0; > + mac_cfg0.soft_reset = 1; > + if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port), > + &mac_cfg0, 4)) > + return -1; > + *(netxen_crbword_t *) & mac_cfg0 = 0; > + mac_cfg0.tx_enable = 1; > + mac_cfg0.rx_enable = 1; > + mac_cfg0.rx_flowctl = 0; > + mac_cfg0.tx_reset_pb = 1; > + mac_cfg0.rx_reset_pb = 1; > + mac_cfg0.tx_reset_mac = 1; > + mac_cfg0.rx_reset_mac = 1; > + > + if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port), > + &mac_cfg0, 4)) > + return -1; > + *(netxen_crbword_t *) & mac_cfg1 = 0; > + mac_cfg1.preamblelen = 0xf; > + mac_cfg1.duplex = 1; > + mac_cfg1.crc_enable = 1; > + mac_cfg1.padshort = 1; > + mac_cfg1.checklength = 1; > + mac_cfg1.hugeframes = 1; > + > + if (mode == NETXEN_NIU_10_100_MB) { > + mac_cfg1.intfmode = 1; > + if (netxen_nic_hw_write_wx(adapter, > + NETXEN_NIU_GB_MAC_CONFIG_1(port), > + &mac_cfg1, 4)) > + return -1; > + > + /* set mii mode */ > + netxen_crb_writelit_adapter(adapter, NETXEN_NIU_GB0_GMII_MODE + > + (port << 3), 0); > + netxen_crb_writelit_adapter(adapter, NETXEN_NIU_GB0_MII_MODE + > + (port << 3), 1); > + > + } else if (mode == NETXEN_NIU_1000_MB) { > + mac_cfg1.intfmode = 2; > + if (netxen_nic_hw_write_wx(adapter, > + NETXEN_NIU_GB_MAC_CONFIG_1(port), > + &mac_cfg1, 4)) > + return -1; > + /* set gmii mode */ > + netxen_crb_writelit_adapter(adapter, NETXEN_NIU_GB0_MII_MODE + > + (port << 3), 0); > + netxen_crb_writelit_adapter(adapter, NETXEN_NIU_GB0_GMII_MODE + > + (port << 3), 1); > + } > + *(netxen_crbword_t *) & mii_cfg = 0; > + mii_cfg.clockselect = 7; > + if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_CONFIG(port), > + &mii_cfg, 4)) > + return -1; > + > + *(netxen_crbword_t *) & mac_cfg0 = 0; > + mac_cfg0.tx_enable = 1; > + mac_cfg0.rx_enable = 1; > + mac_cfg0.tx_flowctl = 0; > + mac_cfg0.rx_flowctl = 0; > + if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port), > + &mac_cfg0, 4)) > + return -1; > + return 0; > +} > + > +/* Disable a GbE interface */ > +long netxen_niu_disable_gbe_port(struct netxen_adapter *adapter, long port) > +{ > + struct netxen_niu_gb_mac_config_0_t mac_cfg0; > + > + if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS)) > + return -1; return -EINVAL? > + > + *(netxen_crbword_t *) & mac_cfg0 = 0; > + mac_cfg0.soft_reset = 1; > + if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port), > + &mac_cfg0, 4)) > + return -1; > + return 0; how about just return netxen_nic_hw_write_wx(...) > +} > + > +/* Disable an XG interface */ > +long netxen_niu_disable_xg_port(struct netxen_adapter *adapter, long port) > +{ > + struct netxen_niu_xg_mac_config_0_t mac_cfg; > + > + if (port != 0) > + return -1; > + > + *(netxen_crbword_t *) & mac_cfg = 0; > + mac_cfg.soft_reset = 1; > + if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_XGE_CONFIG_0, > + &mac_cfg, 4)) > + return -1; > + return 0; > +} > + > +/* Set promiscuous mode for a GbE interface */ > +long netxen_niu_set_promiscuous_mode(struct netxen_adapter *adapter, long > port, > + netxen_niu_prom_mode_t mode) > +{ > + struct netxen_niu_gb_drop_crc reg; > + long data; > + > + if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS)) > + return -1; > + > + if (mode == NETXEN_NIU_PROMISCOUS_MODE) > + data = 0; > + else > + data = 1; > + > + /* save previous contents */ > + if (netxen_nic_hw_read_wx(adapter, NETXEN_NIU_GB_DROP_WRONGADDR, > + ®, 4)) > + return -1; > + switch (port) { > + case 0: > + reg.drop_gb0 = data; > + break; > + case 1: > + reg.drop_gb0 = data; > + break; > + case 2: > + reg.drop_gb0 = data; > + break; > + case 3: > + reg.drop_gb0 = data; > + break; > + default: > + return -1; > + } > + if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_DROP_WRONGADDR, > + ®, 4)) > + return -1; > + return 0; > +} > + > +/** > + * Set the MAC address for an XG port > + * Note that the passed-in value must already be in network byte order. > + **/ > +int netxen_niu_xg_macaddr_set(struct netxen_adapter *adapter, int phy, > + netxen_ethernet_macaddr_t addr) > +{ > + netxen_crbword_t temp = 0; > + > + if ((phy < 0) || (phy > 3)) > + return -1; > + > + memcpy(&temp, addr, 2); > + temp <<= 16; > + if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_XGE_STATION_ADDR_0_1, > + &temp, 4)) > + return -1; > + > + temp = 0; > + > + memcpy(&temp, ((u8 *) addr) + 2, sizeof(netxen_crbword_t)); > + if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_XGE_STATION_ADDR_0_HI, > + &temp, 4)) > + return -1; > + > + return 0; > +} > + > +/** > + * Return the current station MAC address. > + * Note that the passed-in value must already be in network byte order. > + **/ > +int netxen_niu_xg_macaddr_get(struct netxen_adapter *adapter, int phy, > + netxen_ethernet_macaddr_t * addr) > +{ > + netxen_crbword_t stationhigh; > + netxen_crbword_t stationlow; > + u64 result; > + > + if (addr == NULL) > + return -1; > + if (phy != 0) > + return -1; > + > + if (netxen_nic_hw_read_wx(adapter, NETXEN_NIU_XGE_STATION_ADDR_0_HI, > + &stationhigh, 4)) > + return -1; > + if (netxen_nic_hw_read_wx(adapter, NETXEN_NIU_XGE_STATION_ADDR_0_1, > + &stationlow, 4)) > + return -1; > + > + result = ((u64) stationlow) >> 16; > + result |= (u64) stationhigh << 16; > + memcpy(*addr, &result, sizeof(netxen_ethernet_macaddr_t)); > + > + return 0; > +} > + > +long netxen_niu_xg_set_promiscuous_mode(struct netxen_adapter *adapter, > + long port, netxen_niu_prom_mode_t mode) > +{ > + long reg; > + > + if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS)) > + return -1; > + > + if (netxen_nic_hw_read_wx(adapter, NETXEN_NIU_XGE_CONFIG_1, ®, 4)) > + return -1; > + if (mode == NETXEN_NIU_PROMISCOUS_MODE) > + reg = (reg | 0x2000UL); > + else > + reg = (reg & ~0x2000UL); > + > + netxen_crb_writelit_adapter(adapter, NETXEN_NIU_XGE_CONFIG_1, reg); > + > + return 0; > +} > - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html