static void frame_cache(struct tvb_frame *frame_tvb) { struct wtap_pkthdr phdr; /* Packet header */ if (frame_tvb->buf == NULL) { frame_tvb->buf = (struct Buffer *) g_malloc(sizeof(struct Buffer)); /* XXX, register frame_tvb to some list which frees from time to time not used buffers :] */ buffer_init(frame_tvb->buf, frame_tvb->tvb.length + frame_tvb->offset); if (!frame_read(frame_tvb, &phdr, frame_tvb->buf)) { /* TODO: THROW(???); */ } } frame_tvb->tvb.real_data = buffer_start_ptr(frame_tvb->buf) + frame_tvb->offset; }
int net_cs8900a_read_halfword (struct device_desc *dev, uint32 addr, uint16 * data) { struct net_device *net_dev = (struct net_device *) dev->dev; struct net_cs8900a_io *io = (struct net_cs8900a_io *) dev->data; int offset = (uint16) (addr - dev->base); int ret = ADDR_HIT; *data = 0; switch (offset) { case Rx_Frame_Port: frame_read (dev, data); break; case IO_ISQ: isq_read (dev, data); break; case PP_Address: *data = io->pp_address | 0x3000; break; case PP_Data: if (io->pp_address >= 0x100 && io->pp_address < 0x140) { ctrl_status_read (dev, data); } switch (io->pp_address) { case PP_ProductID: *data = io->product_id[0]; break; case PP_ProductID + 2: *data = io->product_id[1]; break; case PP_IntNum: *data = io->int_num; break; case PP_EEPROMCommand: *data = io->eeprom_cmd; break; case PP_EEPROMData: eeprom_read (dev, data); break; case PP_IA: case PP_IA + 2: case PP_IA + 4: *data = io->ieee_addr[io->pp_address - PP_IA] | (io-> ieee_addr[io->pp_address - PP_IA + 1] << 8); break; case PP_ISQ: isq_read (dev, data); break; case PP_RxStatus: *data = *(io->rx_status_p); *(io->rx_status_p) = 0; io->rx_tail++; break; case PP_RxLength: *data = *(io->rx_length_p); *(io->rx_length_p) = 0; io->rx_tail++; break; } //printf("addr:%x, data:%x\n", io->pp_address, *data); break; default: break; } return ret; }