/* ARGSUSED */ void sm_pm_ls_latch(struct s_smc *smc, int phy, int on_off) /* int on_off; en- or disable ident. ls */ { SK_UNUSED(smc) ; phy = phy ; on_off = on_off ; }
static int plc_send_bits(struct s_smc *smc, struct s_phy *phy, int len) { int np = phy->np ; /* PHY index */ int n ; int i ; SK_UNUSED(smc) ; /* create bit vector */ for (i = len-1,n = 0 ; i >= 0 ; i--) { n = (n<<1) | phy->t_val[phy->bitn+i] ; } if (inpw(PLC(np,PL_STATUS_B)) & PL_PCM_SIGNAL) { #if 0 printf("PL_PCM_SIGNAL is set\n") ; #endif return 1; } /* write bit[n] & length = 1 to regs */ outpw(PLC(np,PL_VECTOR_LEN),len-1) ; /* len=nr-1 */ outpw(PLC(np,PL_XMIT_VECTOR),n) ; #ifdef DEBUG #if 1 #ifdef DEBUG_BRD if (smc->debug.d_plc & 0x80) #else if (debug.d_plc & 0x80) #endif printf("SIGNALING bit %d .. %d\n",phy->bitn,phy->bitn+len-1) ; #endif #endif return 0; }
/* * control PCM state machine */ static void plc_go_state(struct s_smc *smc, int p, int state) { HW_PTR port ; int val ; SK_UNUSED(smc) ; port = (HW_PTR) (PLC(p,PL_CNTRL_B)) ; val = inpw(port) & ~(PL_PCM_CNTRL | PL_MAINT) ; outpw(port,val) ; outpw(port,val | state) ; }
void init_plc(struct s_smc *smc) { SK_UNUSED(smc) ; /* * dummy * this is an obsolete public entry point that has to remain * for compat. It is used by various drivers. * the work is now done in real_init_plc() * which is called from pcm_init() ; */ }
static void smt_stop_watchdog(struct s_smc *smc) { SK_UNUSED(smc) ; /* Make LINT happy. */ #ifndef DEBUG #ifdef PCI if (smc->hw.wdog_used) { outpw(ADDR(B2_WDOG_CRTL),TIM_STOP) ; /* Stop timer. */ } #endif #endif /* DEBUG */ }
/* * llc_recover_tx called by init_tx (fplus.c) */ void llc_recover_tx(struct s_smc *smc) { #ifdef LOAD_GEN extern int load_gen_flag ; load_gen_flag = 0 ; #endif #ifndef SYNC smc->hw.n_a_send= 0 ; #else SK_UNUSED(smc) ; #endif }
static u_long repair_rxd_ring(struct s_smc *smc, struct s_smt_rx_queue *queue) { int i ; int rx_used ; u_long phys ; u_long rbctrl ; struct s_smt_fp_rxd volatile *r ; SK_UNUSED(smc) ; r = queue->rx_curr_get ; rx_used = queue->rx_used ; for (i = SMT_R1_RXD_COUNT-1 ; i ; i-- ) { r = r->rxd_next ; } phys = le32_to_cpu(r->rxd_nrdadr) ; r = queue->rx_curr_get ; while (rx_used) { DRV_BUF_FLUSH(r,DDI_DMA_SYNC_FORCPU) ; rbctrl = le32_to_cpu(r->rxd_rbctrl) ; if (rbctrl & BMU_OWN) { if (rbctrl & BMU_STF) { break ; /* exit the loop */ } else { /* * repair the descriptor */ r->rxd_rbctrl &= ~cpu_to_le32(BMU_OWN) ; } } phys = le32_to_cpu(r->rxd_nrdadr) ; DRV_BUF_FLUSH(r,DDI_DMA_SYNC_FORDEV) ; r = r->rxd_next ; rx_used-- ; } return(phys) ; }
static u_long repair_txd_ring(struct s_smc *smc, struct s_smt_tx_queue *queue) { int i ; int tx_used ; u_long phys ; u_long tbctrl ; struct s_smt_fp_txd volatile *t ; SK_UNUSED(smc) ; t = queue->tx_curr_get ; tx_used = queue->tx_used ; for (i = tx_used+queue->tx_free-1 ; i ; i-- ) { t = t->txd_next ; } phys = le32_to_cpu(t->txd_ntdadr) ; t = queue->tx_curr_get ; while (tx_used) { DRV_BUF_FLUSH(t,DDI_DMA_SYNC_FORCPU) ; tbctrl = le32_to_cpu(t->txd_tbctrl) ; if (tbctrl & BMU_OWN) { if (tbctrl & BMU_STF) { break ; /* exit the loop */ } else { /* * repair the descriptor */ t->txd_tbctrl &= ~cpu_to_le32(BMU_OWN) ; } } phys = le32_to_cpu(t->txd_ntdadr) ; DRV_BUF_FLUSH(t,DDI_DMA_SYNC_FORDEV) ; t = t->txd_next ; tx_used-- ; } return(phys) ; }
/* * FDDI card reset */ static void card_start(struct s_smc *smc) { int i ; #ifdef PCI u_char rev_id ; u_short word; #endif smt_stop_watchdog(smc) ; #ifdef PCI /* * make sure no transfer activity is pending */ outpw(FM_A(FM_MDREG1),FM_MINIT) ; outp(ADDR(B0_CTRL), CTRL_HPI_SET) ; hwt_wait_time(smc,hwt_quick_read(smc),MS2BCLK(10)) ; /* * now reset everything */ outp(ADDR(B0_CTRL),CTRL_RST_SET) ; /* reset for all chips */ i = (int) inp(ADDR(B0_CTRL)) ; /* do dummy read */ SK_UNUSED(i) ; /* Make LINT happy. */ outp(ADDR(B0_CTRL), CTRL_RST_CLR) ; /* * Reset all bits in the PCI STATUS register */ outp(ADDR(B0_TST_CTRL), TST_CFG_WRITE_ON) ; /* enable for writes */ word = inpw(PCI_C(PCI_STATUS)) ; outpw(PCI_C(PCI_STATUS), word | PCI_ERRBITS) ; outp(ADDR(B0_TST_CTRL), TST_CFG_WRITE_OFF) ; /* disable writes */ /* * Release the reset of all the State machines * Release Master_Reset * Release HPI_SM_Reset */ outp(ADDR(B0_CTRL), CTRL_MRST_CLR|CTRL_HPI_CLR) ; /* * determine the adapter type * Note: Do it here, because some drivers may call card_start() once * at very first before any other initialization functions is * executed. */ rev_id = inp(PCI_C(PCI_REV_ID)) ; if ((rev_id & 0xf0) == SK_ML_ID_1 || (rev_id & 0xf0) == SK_ML_ID_2) { smc->hw.hw_is_64bit = TRUE ; } else { smc->hw.hw_is_64bit = FALSE ; } /* * Watermark initialization */ if (!smc->hw.hw_is_64bit) { outpd(ADDR(B4_R1_F), RX_WATERMARK) ; outpd(ADDR(B5_XA_F), TX_WATERMARK) ; outpd(ADDR(B5_XS_F), TX_WATERMARK) ; } outp(ADDR(B0_CTRL),CTRL_RST_CLR) ; /* clear the reset chips */ outp(ADDR(B0_LED),LED_GA_OFF|LED_MY_ON|LED_GB_OFF) ; /* ye LED on */ /* init the timer value for the watch dog 2,5 minutes */ outpd(ADDR(B2_WDOG_INI),0x6FC23AC0) ; /* initialize the ISR mask */ smc->hw.is_imask = ISR_MASK ; smc->hw.hw_state = STOPPED ; #endif GET_PAGE(0) ; /* necessary for BOOT */ }
void mac_do_pci_fix(struct s_smc *smc) { SK_UNUSED(smc) ; }
void plc_clear_irq(struct s_smc *smc, int p) { SK_UNUSED(p) ; SK_UNUSED(smc) ; }
/* * return S-port (PA or PB) */ int pcm_get_s_port(struct s_smc *smc) { SK_UNUSED(smc) ; return PS; }
/* * force line state on a PHY output (only in MAINT state) */ static void sm_ph_linestate(struct s_smc *smc, int phy, int ls) { int cntrl ; SK_UNUSED(smc) ; cntrl = (inpw(PLC(phy,PL_CNTRL_B)) & ~PL_MAINT_LS) | PL_PCM_STOP | PL_MAINT ; switch(ls) { case PC_QLS: /* Force Quiet */ cntrl |= PL_M_QUI0 ; break ; case PC_MLS: /* Force Master */ cntrl |= PL_M_MASTR ; break ; case PC_HLS: /* Force Halt */ cntrl |= PL_M_HALT ; break ; default : case PC_ILS: /* Force Idle */ cntrl |= PL_M_IDLE ; break ; case PC_LS_PDR: /* Enable repeat filter */ cntrl |= PL_M_TPDR ; break ; } outpw(PLC(phy,PL_CNTRL_B),cntrl) ; }