void _mrf_buff_print(){ int i; mrf_debug("_mrf_buff_print warning is %s\n",illegal_state_warning); mrf_debug("free? %s\n",mrf_buff_state_name(0)); for ( i = 0 ; i < _MRF_BUFFS ; i++){ MRF_BUFF_STATE *bst = _mrf_buff_state(i); mrf_debug("buff %d state %d (%s) owner %d\n",i,bst->state,mrf_buff_state_name(i),_mrf_buffst[i].owner); } }
void mrf_free(uint8* buff){ int i; for ( i = 0 ; i < _MRF_BUFFS ; i++) if(buff == &(_mrf_buff[i][0])){ _mrf_buff_free(i); mrf_debug("mrf_free : free buff %d %d/%d buffs free\n",i,mrf_buff_num_free(),_MRF_BUFFS); return; } mrf_debug("ERROR : buff was not found or freed\n\n"); }
//extern const MRF_CMD const mrf_cmds[]; void _mrf_buff_free(uint8 i){ if (i < _MRF_BUFFS){ _mrf_buffst[i].state = FREE; _mrf_buffst[i].owner = NUM_INTERFACES; mrf_debug("_mrf_buff_free : free buff %d %d/%d buffs free\n",i,mrf_buff_num_free(),_MRF_BUFFS); return; } mrf_debug("_mrf_buff_free error buff num was %d\n",i); }
uint8 mrf_alloc_if(I_F i_f){ uint8 i; mrf_debug("mrf_alloc_if entry i_f %d\n",i_f); //_mrf_buff_print(); for ( i = 0 ; i < _MRF_BUFFS ; i++){ if ( _mrf_buffst[i].state == FREE) { _mrf_buffst[i].state = LOADING; _mrf_buffst[i].owner = i_f; mrf_debug("mrf_alloc_if : alloc buff %d to i_f %d\n",i,i_f); return i; } } return _MRF_BUFFS; }
int8 mrf_if_tx_queue(I_F i_f, uint8 bnum ){ const MRF_IF *mif = mrf_if_ptr(i_f); MRF_BUFF_STATE *mbst = _mrf_buff_state(bnum); BuffQueue *qp = mif->txqueue; //mrf_debug(5,"mrf_if_tx_queue entry\n"); if ( bnum >= _MRF_BUFFS) return -2; //mrf_debug(5,"mrf_if_tx_queue 1\n"); if (qp->push(bnum) == 0) { //_sys_ifs[i_f].status->state = MRF_ST_TXQ; mbst->owner = i_f; mbst->tx_timer = mif->type->tx_del; // FIXME shouldn't need any of this mbst->state = TXQUEUE; mbst->retry_count = 0; mrf_tick_enable(); mrf_debug(5,"mrf_if_tx_queue OK i_f %d buff %d retry_count %d qip %d qop %d items %d\n", i_f,bnum,mbst->retry_count,qp->get_qip(),qp->get_qop(),qp->items()); return 0; } else { // fall through if no space in queue mrf_if_ptr(i_f)->status->stats.tx_overruns++; return -1; } }
uint8 get_relay_state(uint8 chan){ mrf_debug(4,"get_relay_state 0x%u\n",_relay_state); if ( _relay_state & (uint16)( 1 << chan )) return 1; else return 0; }
// this is where OS processes buffer int mrf_buff_loaded(uint8 bnum){ MRF_IF *ifp; if (bnum < _MRF_BUFFS){ mrf_debug("mrf_buff_loaded bnum entry %u owner %u\n",bnum, _mrf_buffst[bnum].owner); ifp = mrf_if_ptr( _mrf_buffst[bnum].owner); printf("ifp = %p\n",ifp); ifp->status->stats.rx_pkts += 1; _mrf_buffst[bnum].state = LOADED; //_mrf_buff_print(); _mrf_process_buff(bnum); mrf_debug("mrf_buff_loaded exit\n"); //_mrf_buff_print(); return 0; } else { return -1; } }
void mrf_if_print_info(I_F i_f){ const MRF_IF *ifp; IF_STATUS *ifs = mrf_if_ptr(i_f)->status; int i = (int)i_f; ifp = mrf_if_ptr((I_F)i); mrf_debug(5,"I_F %d state %s waiting_resp %d txq_da %d ackq da %d timer %d resp_timer %d\n",i, mrf_if_state_name(i_f),ifs->waiting_resp, ifp->txqueue->data_avail(),ifp->ackqueue->items(), ifs->timer,ifs->resp_timer); }
uint8 set_relay_state(uint8 chan,uint8 val){ if (chan >= NUM_RELAY_CHANNELS) return 0; //FIXME should be error if ( val == 0 ){ _relay_state &= ~((uint16)( 1 << chan )); } else { _relay_state |= (uint16)( 1 << chan ); } mrf_debug(4,"set_relay_state 0x%u\n",_relay_state); return 0; }
uint8 *mrf_alloc_if_tbd(I_F i_f){ int i; _mrf_buff_print(); for ( i = 0 ; i < _MRF_BUFFS ; i++){ if ( _mrf_buffst[i].state == FREE) { _mrf_buffst[i].state = LOADING; _mrf_buffst[i].owner = i_f; mrf_debug("mrf_alloc_if_tbd : alloc buff %d to i_f %d\n",i,i_f); return &(_mrf_buff[i][0]); } } return NULL; }
uint16 relay_state(){ mrf_debug(4,"relay_state 0x%u\n",_relay_state); return _relay_state; }
void clear_relay_state(){ _relay_state = 0; mrf_debug(4,"clear_relay_state 0x%u\n",_relay_state); }