Exemplo n.º 1
0
int ddekit_pci_writeb
(int bus, int slot, int func, int pos, ddekit_uint8_t val) { 
	struct ddekit_pci_dev * dev = ddekit_get_dev_helper(bus, slot, func);
	if (dev) { 
		pci_attr_w8 (dev->devind, pos, val); 
		DDEBUG_MSG_VERBOSE("bus: %d, slot: %d, func: %d, pos: %x %x",
		    bus, slot, func, pos, val);
		return 0; 
	}
	return -1;
}
Exemplo n.º 2
0
/*===========================================================================*
 *				do_int					     *
 *===========================================================================*/
static void do_int(struct port *pp)
{
    int devind, vcc_5v, vcc_3v, vcc_Xv, vcc_Yv,
        socket_5v, socket_3v, socket_Xv, socket_Yv;
    spin_t spin;
    u32_t csr_event, csr_present, csr_control;
    u8_t v8;
    u16_t v16;
#if USE_INTS
    int r;
#endif

    devind= pp->p_devind;
    v8= pci_attr_r8(devind, TI_CARD_CTRL);
    if (v8 & TI_CCR_IFG)
    {
        printf("ti1225: got functional interrupt\n");
        pci_attr_w8(devind, TI_CARD_CTRL, v8);
    }

    if (debug)
    {
        printf("Socket event: 0x%x\n", pp->csr_ptr->csr_event);
        printf("Socket mask: 0x%x\n", pp->csr_ptr->csr_mask);
    }

    csr_present= pp->csr_ptr->csr_present;
    csr_control= pp->csr_ptr->csr_control;

    if ((csr_present & (CP_CDETECT1|CP_CDETECT2)) != 0)
    {
        if (debug)
            printf("do_int: no card present\n");
        return;
    }
    if (csr_present & CP_BADVCCREQ)
    {
        printf("do_int: Bad Vcc request\n");
        /* return; */
    }
    if (csr_present & CP_DATALOST)
    {
        /* Do we care? */
        if (debug)
            printf("do_int: Data lost\n");
        /* return; */
    }
    if (csr_present & CP_NOTACARD)
    {
        printf("do_int: Not a card\n");
        return;
    }
    if (debug)
    {
        if (csr_present & CP_CBCARD)
            printf("do_int: Cardbus card detected\n");
        if (csr_present & CP_16BITCARD)
            printf("do_int: 16-bit card detected\n");
    }
    if (csr_present & CP_PWRCYCLE)
    {
        if (debug)
            printf("do_int: powered up\n");
        return;
    }
    vcc_5v= !!(csr_present & CP_5VCARD);
    vcc_3v= !!(csr_present & CP_3VCARD);
    vcc_Xv= !!(csr_present & CP_XVCARD);
    vcc_Yv= !!(csr_present & CP_YVCARD);
    if (debug)
    {
        printf("do_int: card supports:%s%s%s%s\n",
               vcc_5v ? " 5V" : "", vcc_3v ? " 3V" : "",
               vcc_Xv ? " X.X V" : "", vcc_Yv ? " Y.Y V" : "");
    }
    socket_5v= !!(csr_present & CP_5VSOCKET);
    socket_3v= !!(csr_present & CP_3VSOCKET);
    socket_Xv= !!(csr_present & CP_XVSOCKET);
    socket_Yv= !!(csr_present & CP_YVSOCKET);
    if (debug)
    {
        printf("do_int: socket supports:%s%s%s%s\n",
               socket_5v ? " 5V" : "", socket_3v ? " 3V" : "",
               socket_Xv ? " X.X V" : "", socket_Yv ? " Y.Y V" : "");
    }
    if (vcc_5v && socket_5v)
    {
        csr_control= (csr_control & ~CC_VCCCTRL) | CC_VCC_5V;
        pp->csr_ptr->csr_control= csr_control;
        if (debug)
            printf("do_int: applying 5V\n");
    }
    else if (vcc_3v && socket_3v)
    {
        csr_control= (csr_control & ~CC_VCCCTRL) | CC_VCC_3V;
        pp->csr_ptr->csr_control= csr_control;
        if (debug)
            printf("do_int: applying 3V\n");
    }
    else if (vcc_Xv && socket_Xv)
    {
        csr_control= (csr_control & ~CC_VCCCTRL) | CC_VCC_XV;
        pp->csr_ptr->csr_control= csr_control;
        printf("do_int: applying X.X V\n");
    }
    else if (vcc_Yv && socket_Yv)
    {
        csr_control= (csr_control & ~CC_VCCCTRL) | CC_VCC_YV;
        pp->csr_ptr->csr_control= csr_control;
        printf("do_int: applying Y.Y V\n");
    }
    else
    {
        printf("do_int: socket and card are not compatible\n");
        return;
    }

    csr_event= pp->csr_ptr->csr_event;
    if (csr_event)
    {
        if (debug)
            printf("clearing socket event\n");
        pp->csr_ptr->csr_event= csr_event;
        if (debug)
        {
            printf("Socket event (cleared): 0x%x\n",
                   pp->csr_ptr->csr_event);
        }
    }

    devind= pp->p_devind;
    v8= pci_attr_r8(devind, TI_CARD_CTRL);
    if (v8 & TI_CCR_IFG)
    {
        printf("ti1225: got functional interrupt\n");
        pci_attr_w8(devind, TI_CARD_CTRL, v8);
    }

    if (debug)
    {
        v8= pci_attr_r8(devind, TI_CARD_CTRL);
        printf("TI_CARD_CTRL: 0x%02x\n", v8);
    }

    spin_init(&spin, 100000);
    do {
        csr_present= pp->csr_ptr->csr_present;
        if (csr_present & CP_PWRCYCLE)
            break;
    } while (spin_check(&spin));

    if (!(csr_present & CP_PWRCYCLE))
    {
        printf("do_int: not powered up?\n");
        return;
    }

    /* Reset device */
    v16= pci_attr_r16(devind, CBB_BRIDGECTRL);
    v16 |= CBB_BC_CRST;
    pci_attr_w16(devind, CBB_BRIDGECTRL, v16);

    /* Wait one microsecond. Is this correct? What are the specs? */
    micro_delay(1);

    /* Clear CBB_BC_CRST */
    v16= pci_attr_r16(devind, CBB_BRIDGECTRL);
    v16 &= ~CBB_BC_CRST;
    pci_attr_w16(devind, CBB_BRIDGECTRL, v16);

    /* Wait one microsecond after clearing the reset line. Is this
     * correct? What are the specs?
     */
    micro_delay(1);

    pci_rescan_bus(pp->p_cb_busnr);

#if USE_INTS
    r= sys_irqenable(&pp->p_hook);
    if (r != OK)
        panic("unable enable interrupts: %d", r);
#endif

}