Exemplo n.º 1
0
static void redrat3_read_packet_start(struct redrat3_dev *rr3, int len)
{
	u16 tx_error;
	u16 hdrlen;

	rr3_ftr(rr3->dev, "Entering %s\n", __func__);

	/*                                      */
	memcpy(&(rr3->pktlen), (unsigned char *) rr3->bulk_in_buf,
	       sizeof(rr3->pktlen));
	memcpy(&(rr3->pkttype), ((unsigned char *) rr3->bulk_in_buf +
		sizeof(rr3->pktlen)),
	       sizeof(rr3->pkttype));

	/*                                                      */
	rr3->pktlen = be16_to_cpu(rr3->pktlen);
	rr3->pkttype = be16_to_cpu(rr3->pkttype);

	switch (rr3->pkttype) {
	case RR3_ERROR:
		memcpy(&tx_error, ((unsigned char *)rr3->bulk_in_buf
			+ (sizeof(rr3->pktlen) + sizeof(rr3->pkttype))),
		       sizeof(tx_error));
		tx_error = be16_to_cpu(tx_error);
		redrat3_dump_fw_error(rr3, tx_error);
		break;

	case RR3_MOD_SIGNAL_IN:
		hdrlen = sizeof(rr3->pktlen) + sizeof(rr3->pkttype);
		rr3->bytes_read = len;
		rr3->bytes_read -= hdrlen;
		rr3->datap = &(rr3->pbuf[0]);

		memcpy(rr3->datap, ((unsigned char *)rr3->bulk_in_buf + hdrlen),
		       rr3->bytes_read);
		rr3->datap += rr3->bytes_read;
		rr3_dbg(rr3->dev, "bytes_read %d, pktlen %d\n",
			rr3->bytes_read, rr3->pktlen);
		break;

	default:
		rr3_dbg(rr3->dev, "ignoring packet with type 0x%02x, "
			"len of %d, 0x%02x\n", rr3->pkttype, len, rr3->pktlen);
		break;
	}
}
static void redrat3_read_packet_start(struct redrat3_dev *rr3, unsigned len)
{
    struct redrat3_header *header = rr3->bulk_in_buf;
    unsigned pktlen, pkttype;

    rr3_ftr(rr3->dev, "Entering %s\n", __func__);

    /* grab the Length and type of transfer */
    pktlen = be16_to_cpu(header->length);
    pkttype = be16_to_cpu(header->transfer_type);

    if (pktlen > sizeof(rr3->irdata)) {
        dev_warn(rr3->dev, "packet length %u too large\n", pktlen);
        return;
    }

    switch (pkttype) {
    case RR3_ERROR:
        if (len >= sizeof(struct redrat3_error)) {
            struct redrat3_error *error = rr3->bulk_in_buf;
            unsigned fw_error = be16_to_cpu(error->fw_error);
            redrat3_dump_fw_error(rr3, fw_error);
        }
        break;

    case RR3_MOD_SIGNAL_IN:
        memcpy(&rr3->irdata, rr3->bulk_in_buf, len);
        rr3->bytes_read = len;
        rr3_dbg(rr3->dev, "bytes_read %d, pktlen %d\n",
                rr3->bytes_read, pktlen);
        break;

    default:
        rr3_dbg(rr3->dev, "ignoring packet with type 0x%02x, len of %d, 0x%02x\n",
                pkttype, len, pktlen);
        break;
    }
}