⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skfddi.c

📁 h内核
💻 C
📖 第 1 页 / 共 5 页
字号:
	return (0);fail:	if (bp->SharedMemAddr) {		pci_free_consistent(&bp->pdev,				    bp->SharedMemSize,				    bp->SharedMemAddr,				    bp->SharedMemDMA);		bp->SharedMemAddr = NULL;	}	if (bp->LocalRxBuffer) {		pci_free_consistent(&bp->pdev, MAX_FRAME_SIZE,				    bp->LocalRxBuffer, bp->LocalRxBufferDMA);		bp->LocalRxBuffer = NULL;	}	return err;}				// skfp_driver_init/* * ============= * = skfp_open = * ============= *    * Overview: *   Opens the adapter *   * Returns: *   Condition code *        * Arguments: *   dev - pointer to device information * * Functional Description: *   This function brings the adapter to an operational state. * * Return Codes: *   0           - Adapter was successfully opened *   -EAGAIN - Could not register IRQ */static int skfp_open(struct net_device *dev){	struct s_smc *smc = netdev_priv(dev);	int err;	PRINTK(KERN_INFO "entering skfp_open\n");	/* Register IRQ - support shared interrupts by passing device ptr */	err = request_irq(dev->irq, (void *) skfp_interrupt, SA_SHIRQ,			  dev->name, dev);	if (err)		return err;	/*	 * Set current address to factory MAC address	 *	 * Note: We've already done this step in skfp_driver_init.	 *       However, it's possible that a user has set a node	 *               address override, then closed and reopened the	 *               adapter.  Unless we reset the device address field	 *               now, we'll continue to use the existing modified	 *               address.	 */	read_address(smc, NULL);	memcpy(dev->dev_addr, smc->hw.fddi_canon_addr.a, 6);	init_smt(smc, NULL);	smt_online(smc, 1);	STI_FBI();	/* Clear local multicast address tables */	mac_clear_multicast(smc);	/* Disable promiscuous filter settings */	mac_drv_rx_mode(smc, RX_DISABLE_PROMISC);	netif_start_queue(dev);	return (0);}				// skfp_open/* * ============== * = skfp_close = * ============== *    * Overview: *   Closes the device/module. *   * Returns: *   Condition code *        * Arguments: *   dev - pointer to device information * * Functional Description: *   This routine closes the adapter and brings it to a safe state. *   The interrupt service routine is deregistered with the OS. *   The adapter can be opened again with another call to skfp_open(). * * Return Codes: *   Always return 0. * * Assumptions: *   No further requests for this adapter are made after this routine is *   called.  skfp_open() can be called to reset and reinitialize the *   adapter. */static int skfp_close(struct net_device *dev){	struct s_smc *smc = netdev_priv(dev);	skfddi_priv *bp = &smc->os;	CLI_FBI();	smt_reset_defaults(smc, 1);	card_stop(smc);	mac_drv_clear_tx_queue(smc);	mac_drv_clear_rx_queue(smc);	netif_stop_queue(dev);	/* Deregister (free) IRQ */	free_irq(dev->irq, dev);	skb_queue_purge(&bp->SendSkbQueue);	bp->QueueSkb = MAX_TX_QUEUE_LEN;	return (0);}				// skfp_close/* * ================== * = skfp_interrupt = * ================== *    * Overview: *   Interrupt processing routine *   * Returns: *   None *        * Arguments: *   irq        - interrupt vector *   dev_id     - pointer to device information *       regs   - pointer to registers structure * * Functional Description: *   This routine calls the interrupt processing routine for this adapter.  It *   disables and reenables adapter interrupts, as appropriate.  We can support *   shared interrupts since the incoming dev_id pointer provides our device *   structure context. All the real work is done in the hardware module. * * Return Codes: *   None * * Assumptions: *   The interrupt acknowledgement at the hardware level (eg. ACKing the PIC *   on Intel-based systems) is done by the operating system outside this *   routine. * *       System interrupts are enabled through this call. * * Side Effects: *   Interrupts are disabled, then reenabled at the adapter. */irqreturn_t skfp_interrupt(int irq, void *dev_id, struct pt_regs *regs){	struct net_device *dev = (struct net_device *) dev_id;	struct s_smc *smc;	/* private board structure pointer */	skfddi_priv *bp;	if (dev == NULL) {		printk("%s: irq %d for unknown device\n", dev->name, irq);		return IRQ_NONE;	}	smc = netdev_priv(dev);	bp = &smc->os;	// IRQs enabled or disabled ?	if (inpd(ADDR(B0_IMSK)) == 0) {		// IRQs are disabled: must be shared interrupt		return IRQ_NONE;	}	// Note: At this point, IRQs are enabled.	if ((inpd(ISR_A) & smc->hw.is_imask) == 0) {	// IRQ?		// Adapter did not issue an IRQ: must be shared interrupt		return IRQ_NONE;	}	CLI_FBI();		// Disable IRQs from our adapter.	spin_lock(&bp->DriverLock);	// Call interrupt handler in hardware module (HWM).	fddi_isr(smc);	if (smc->os.ResetRequested) {		ResetAdapter(smc);		smc->os.ResetRequested = FALSE;	}	spin_unlock(&bp->DriverLock);	STI_FBI();		// Enable IRQs from our adapter.	return IRQ_HANDLED;}				// skfp_interrupt/* * ====================== * = skfp_ctl_get_stats = * ====================== *    * Overview: *   Get statistics for FDDI adapter *   * Returns: *   Pointer to FDDI statistics structure *        * Arguments: *   dev - pointer to device information * * Functional Description: *   Gets current MIB objects from adapter, then *   returns FDDI statistics structure as defined *   in if_fddi.h. * *   Note: Since the FDDI statistics structure is *   still new and the device structure doesn't *   have an FDDI-specific get statistics handler, *   we'll return the FDDI statistics structure as *   a pointer to an Ethernet statistics structure. *   That way, at least the first part of the statistics *   structure can be decoded properly. *   We'll have to pay attention to this routine as the *   device structure becomes more mature and LAN media *   independent. * */struct net_device_stats *skfp_ctl_get_stats(struct net_device *dev){	struct s_smc *bp = netdev_priv(dev);	/* Fill the bp->stats structure with driver-maintained counters */	bp->os.MacStat.port_bs_flag[0] = 0x1234;	bp->os.MacStat.port_bs_flag[1] = 0x5678;// goos: need to fill out fddi statistic#if 0	/* Get FDDI SMT MIB objects *//* Fill the bp->stats structure with the SMT MIB object values */	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));	bp->stats.smt_op_version_id = bp->cmd_rsp_virt->smt_mib_get.smt_op_version_id;	bp->stats.smt_hi_version_id = bp->cmd_rsp_virt->smt_mib_get.smt_hi_version_id;	bp->stats.smt_lo_version_id = bp->cmd_rsp_virt->smt_mib_get.smt_lo_version_id;	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));	bp->stats.smt_mib_version_id = bp->cmd_rsp_virt->smt_mib_get.smt_mib_version_id;	bp->stats.smt_mac_cts = bp->cmd_rsp_virt->smt_mib_get.smt_mac_ct;	bp->stats.smt_non_master_cts = bp->cmd_rsp_virt->smt_mib_get.smt_non_master_ct;	bp->stats.smt_master_cts = bp->cmd_rsp_virt->smt_mib_get.smt_master_ct;	bp->stats.smt_available_paths = bp->cmd_rsp_virt->smt_mib_get.smt_available_paths;	bp->stats.smt_config_capabilities = bp->cmd_rsp_virt->smt_mib_get.smt_config_capabilities;	bp->stats.smt_config_policy = bp->cmd_rsp_virt->smt_mib_get.smt_config_policy;	bp->stats.smt_connection_policy = bp->cmd_rsp_virt->smt_mib_get.smt_connection_policy;	bp->stats.smt_t_notify = bp->cmd_rsp_virt->smt_mib_get.smt_t_notify;	bp->stats.smt_stat_rpt_policy = bp->cmd_rsp_virt->smt_mib_get.smt_stat_rpt_policy;	bp->stats.smt_trace_max_expiration = bp->cmd_rsp_virt->smt_mib_get.smt_trace_max_expiration;	bp->stats.smt_bypass_present = bp->cmd_rsp_virt->smt_mib_get.smt_bypass_present;	bp->stats.smt_ecm_state = bp->cmd_rsp_virt->smt_mib_get.smt_ecm_state;	bp->stats.smt_cf_state = bp->cmd_rsp_virt->smt_mib_get.smt_cf_state;	bp->stats.smt_remote_disconnect_flag = bp->cmd_rsp_virt->smt_mib_get.smt_remote_disconnect_flag;	bp->stats.smt_station_status = bp->cmd_rsp_virt->smt_mib_get.smt_station_status;	bp->stats.smt_peer_wrap_flag = bp->cmd_rsp_virt->smt_mib_get.smt_peer_wrap_flag;	bp->stats.smt_time_stamp = bp->cmd_rsp_virt->smt_mib_get.smt_msg_time_stamp.ls;	bp->stats.smt_transition_time_stamp = bp->cmd_rsp_virt->smt_mib_get.smt_transition_time_stamp.ls;	bp->stats.mac_frame_status_functions = bp->cmd_rsp_virt->smt_mib_get.mac_frame_status_functions;	bp->stats.mac_t_max_capability = bp->cmd_rsp_virt->smt_mib_get.mac_t_max_capability;	bp->stats.mac_tvx_capability = bp->cmd_rsp_virt->smt_mib_get.mac_tvx_capability;	bp->stats.mac_available_paths = bp->cmd_rsp_virt->smt_mib_get.mac_available_paths;	bp->stats.mac_current_path = bp->cmd_rsp_virt->smt_mib_get.mac_current_path;	memcpy(bp->stats.mac_upstream_nbr, &bp->cmd_rsp_virt->smt_mib_get.mac_upstream_nbr, FDDI_K_ALEN);	memcpy(bp->stats.mac_downstream_nbr, &bp->cmd_rsp_virt->smt_mib_get.mac_downstream_nbr, FDDI_K_ALEN);	memcpy(bp->stats.mac_old_upstream_nbr, &bp->cmd_rsp_virt->smt_mib_get.mac_old_upstream_nbr, FDDI_K_ALEN);	memcpy(bp->stats.mac_old_downstream_nbr, &bp->cmd_rsp_virt->smt_mib_get.mac_old_downstream_nbr, FDDI_K_ALEN);	bp->stats.mac_dup_address_test = bp->cmd_rsp_virt->smt_mib_get.mac_dup_address_test;	bp->stats.mac_requested_paths = bp->cmd_rsp_virt->smt_mib_get.mac_requested_paths;	bp->stats.mac_downstream_port_type = bp->cmd_rsp_virt->smt_mib_get.mac_downstream_port_type;	memcpy(bp->stats.mac_smt_address, &bp->cmd_rsp_virt->smt_mib_get.mac_smt_address, FDDI_K_ALEN);	bp->stats.mac_t_req = bp->cmd_rsp_virt->smt_mib_get.mac_t_req;	bp->stats.mac_t_neg = bp->cmd_rsp_virt->smt_mib_get.mac_t_neg;	bp->stats.mac_t_max = bp->cmd_rsp_virt->smt_mib_get.mac_t_max;	bp->stats.mac_tvx_value = bp->cmd_rsp_virt->smt_mib_get.mac_tvx_value;	bp->stats.mac_frame_error_threshold = bp->cmd_rsp_virt->smt_mib_get.mac_frame_error_threshold;	bp->stats.mac_frame_error_ratio = bp->cmd_rsp_virt->smt_mib_get.mac_frame_error_ratio;	bp->stats.mac_rmt_state = bp->cmd_rsp_virt->smt_mib_get.mac_rmt_state;	bp->stats.mac_da_flag = bp->cmd_rsp_virt->smt_mib_get.mac_da_flag;	bp->stats.mac_una_da_flag = bp->cmd_rsp_virt->smt_mib_get.mac_unda_flag;	bp->stats.mac_frame_error_flag = bp->cmd_rsp_virt->smt_mib_get.mac_frame_error_flag;	bp->stats.mac_ma_unitdata_available = bp->cmd_rsp_virt->smt_mib_get.mac_ma_unitdata_available;	bp->stats.mac_hardware_present = bp->cmd_rsp_virt->smt_mib_get.mac_hardware_present;	bp->stats.mac_ma_unitdata_enable = bp->cmd_rsp_virt->smt_mib_get.mac_ma_unitdata_enable;	bp->stats.path_tvx_lower_bound = bp->cmd_rsp_virt->smt_mib_get.path_tvx_lower_bound;	bp->stats.path_t_max_lower_bound = bp->cmd_rsp_virt->smt_mib_get.path_t_max_lower_bound;	bp->stats.path_max_t_req = bp->cmd_rsp_virt->smt_mib_get.path_max_t_req;	memcpy(bp->stats.path_configuration, &bp->cmd_rsp_virt->smt_mib_get.path_configuration, sizeof(bp->cmd_rsp_virt->smt_mib_get.path_configuration));	bp->stats.port_my_type[0] = bp->cmd_rsp_virt->smt_mib_get.port_my_type[0];	bp->stats.port_my_type[1] = bp->cmd_rsp_virt->smt_mib_get.port_my_type[1];	bp->stats.port_neighbor_type[0] = bp->cmd_rsp_virt->smt_mib_get.port_neighbor_type[0];	bp->stats.port_neighbor_type[1] = bp->cmd_rsp_virt->smt_mib_get.port_neighbor_type[1];	bp->stats.port_connection_policies[0] = bp->cmd_rsp_virt->smt_mib_get.port_connection_policies[0];	bp->stats.port_connection_policies[1] = bp->cmd_rsp_virt->smt_mib_get.port_connection_policies[1];	bp->stats.port_mac_indicated[0] = bp->cmd_rsp_virt->smt_mib_get.port_mac_indicated[0];	bp->stats.port_mac_indicated[1] = bp->cmd_rsp_virt->smt_mib_get.port_mac_indicated[1];	bp->stats.port_current_path[0] = bp->cmd_rsp_virt->smt_mib_get.port_current_path[0];	bp->stats.port_current_path[1] = bp->cmd_rsp_virt->smt_mib_get.port_current_path[1];	memcpy(&bp->stats.port_requested_paths[0 * 3], &bp->cmd_rsp_virt->smt_mib_get.port_requested_paths[0], 3);	memcpy(&bp->stats.port_requested_paths[1 * 3], &bp->cmd_rsp_virt->smt_mib_get.port_requested_paths[1], 3);	bp->stats.port_mac_placement[0] = bp->cmd_rsp_virt->smt_mib_get.port_mac_placement[0];	bp->stats.port_mac_placement[1] = bp->cmd_rsp_virt->smt_mib_get.port_mac_placement[1];	bp->stats.port_available_paths[0] = bp->cmd_rsp_virt->smt_mib_get.port_available_paths[0];	bp->stats.port_available_paths[1] = bp->cmd_rsp_virt->smt_mib_get.port_available_paths[1];	bp->stats.port_pmd_class[0] = bp->cmd_rsp_virt->smt_mib_get.port_pmd_class[0];	bp->stats.port_pmd_class[1] = bp->cmd_rsp_virt->smt_mib_get.port_pmd_class[1];	bp->stats.port_connection_capabilities[0] = bp->cmd_rsp_virt->smt_mib_get.port_connection_capabilities[0];	bp->stats.port_connection_capabilities[1] = bp->cmd_rsp_virt->smt_mib_get.port_connection_capabilities[1];	bp->stats.port_bs_flag[0] = bp->cmd_rsp_virt->smt_mib_get.port_bs_flag[0];	bp->stats.port_bs_flag[1] = bp->cmd_rsp_virt->smt_mib_get.port_bs_flag[1];	bp->stats.port_ler_estimate[0] = bp->cmd_rsp_virt->smt_mib_get.port_ler_estimate[0];	bp->stats.port_ler_estimate[1] = bp->cmd_rsp_virt->smt_mib_get.port_ler_estimate[1];	bp->stats.port_ler_cutoff[0] = bp->cmd_rsp_virt->smt_mib_get.port_ler_cutoff[0];	bp->stats.port_ler_cutoff[1] = bp->cmd_rsp_virt->smt_mib_get.port_ler_cutoff[1];	bp->stats.port_ler_alarm[0] = bp->cmd_rsp_virt->smt_mib_get.port_ler_alarm[0];	bp->stats.port_ler_alarm[1] = bp->cmd_rsp_virt->smt_mib_get.port_ler_alarm[1];	bp->stats.port_connect_state[0] = bp->cmd_rsp_virt->smt_mib_get.port_connect_state[0];	bp->stats.port_connect_state[1] = bp->cmd_rsp_virt->smt_mib_get.port_connect_state[1];	bp->stats.port_pcm_state[0] = bp->cmd_rsp_virt->smt_mib_get.port_pcm_state[0];	bp->stats.port_pcm_state[1] = bp->cmd_rsp_virt->smt_mib_get.port_pcm_state[1];	bp->stats.port_pc_withhold[0] = bp->cmd_rsp_virt->smt_mib_get.port_pc_withhold[0];	bp->stats.port_pc_withhold[1] = bp->cmd_rsp_virt->smt_mib_get.port_pc_withhold[1];	bp->stats.port_ler_flag[0] = bp->cmd_rsp_virt->smt_mib_get.port_ler_flag[0];	bp->stats.port_ler_flag[1] = bp->cmd_rsp_virt->smt_mib_get.port_ler_flag[1];	bp->stats.port_hardware_present[0] = bp->cmd_rsp_virt->smt_mib_get.port_hardware_present[0];	bp->stats.port_hardware_present[1] = bp->cmd_rsp_virt->smt_mib_get.port_hardware_present[1];	/* Fill the bp->stats structure with the FDDI counter values */	bp->stats.mac_frame_cts = bp->cmd_rsp_virt->cntrs_get.cntrs.frame_cnt.ls;	bp->stats.mac_copied_cts = bp->cmd_rsp_virt->cntrs_get.cntrs.copied_cnt.ls;	bp->stats.mac_transmit_cts = bp->cmd_rsp_virt->cntrs_get.cntrs.transmit_cnt.ls;	bp->stats.mac_error_cts = bp->cmd_rsp_virt->cntrs_get.cntrs.error_cnt.ls;	bp->stats.mac_lost_cts = bp->cmd_rsp_virt->cntrs_get.cntrs.lost_cnt.ls;	bp->stats.port_lct_fail_cts[0] = bp->cmd_rsp_virt->cntrs_get.cntrs.lct_rejects[0].ls;	bp->stats.port_lct_fail_cts[1] = bp->cmd_rsp_virt->cntrs_get.cntrs.lct_rejects[1].ls;	bp->stats.port_lem_reject_cts[0] = bp->cmd_rsp_virt->cntrs_get.cntrs.lem_rejects[0].ls;	bp->stats.port_lem_reject_cts[1] = bp->cmd_rsp_virt->cntrs_get.cntrs.lem_rejects[1].ls;	bp->stats.port_lem_cts[0] = bp->cmd_rsp_virt->cntrs_get.cntrs.link_errors[0].ls;	bp->stats.port_lem_cts[1] = bp->cmd_rsp_virt->cntrs_get.cntrs.link_errors[1].ls;#endif	return ((struct net_device_stats *) &bp->os.MacStat);}				// ctl_get_stat/* * ============================== * = skfp_ctl_set_multicast_list = * ============================== *    * Overview: *   Enable/Disable LLC frame promiscuous mode reception *   on the adapter and/or update multicast address table. *   * Returns: *   None *        * Arguments: *   dev - pointer to device information * * Functional Description: *   This function acquires the driver lock and only calls *   skfp_ctl_set_multicast_list_wo_lock then. *   This routine follows a fairly simple algorithm for setting the *   adapter filters and CAM: * *      if IFF_PROMISC flag is set *              enable promiscuous mode *      else *              disable promiscuous mode *              if number of multicast addresses <= max. multicast number *                      add mc addresses to adapter table *              else *                      enable promiscuous mode *              update adapter filters * * Assumptions: *   Multicast addresses are presented in canonical (LSB) format. * * Side Effects: *   On-board adapter filters are updated. */static void skfp_ctl_set_multicast_list(struct net_device *dev){	struct s_smc *smc = netdev_priv(dev);	skfddi_priv *bp = &smc->os;	unsigned long Flags;	spin_lock_irqsave(&bp->DriverLock, Flags);	skfp_ctl_set_multicast_list_wo_lock(dev);	spin_unlock_irqrestore(&bp->DriverLock, Flags);	return;}				// skfp_ctl_set_multicast_liststatic void skfp_ctl_set_multicast_list_wo_lock(struct net_device *dev){	struct s_smc *smc = netdev_priv(dev);	struct dev_mc_list *dmi;	/* ptr to multicast addr entry */	int i;	/* Enable promiscuous mode, if necessary */	if (dev->flags & IFF_PROMISC) {		mac_drv_rx_mode(smc, RX_ENABLE_PROMISC);		PRINTK(KERN_INFO "PROMISCUOUS MODE ENABLED\n");	}	/* Else, update multicast address table */	else {		mac_drv_rx_mode(smc, RX_DISABLE_PROMISC);		PRINTK(KERN_INFO "PROMISCUOUS MODE DISABLED\n");		// Reset all MC addresses		mac_clear_multicast(smc);		mac_drv_rx_mode(smc, RX_DISABLE_ALLMULTI);		if (dev->flags & IFF_ALLMULTI) {			mac_drv_rx_mode(smc, RX_ENABLE_ALLMULTI);			PRINTK(KERN_INFO "ENABLE ALL MC ADDRESSES\n");		} else if (dev->mc_count > 0) {			if (dev->mc_count <= FPMAX_MULTICAST) {				/* use exact filtering */				// point to first multicast addr				dmi = dev->mc_list;				for (i = 0; i < dev->mc_count; i++) {					mac_add_multicast(smc, 							  (struct fddi_addr *)dmi->dmi_addr, 							  1);					PRINTK(KERN_INFO "ENABLE MC ADDRESS:");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -