Lines Matching refs:ccb
72 void ahci_issue_pending_commands(struct ahci_port *ap, struct ahci_ccb *ccb);
82 static void ahci_empty_done(struct ahci_ccb *ccb);
83 static void ahci_ata_cmd_done(struct ahci_ccb *ccb);
245 struct ahci_ccb *ccb; in ahci_port_alloc() local
407 ccb = &ap->ap_ccbs[i]; in ahci_port_alloc()
410 &ccb->ccb_dmamap); in ahci_port_alloc()
418 callout_init_mp(&ccb->ccb_timeout); in ahci_port_alloc()
419 ccb->ccb_slot = i; in ahci_port_alloc()
420 ccb->ccb_port = ap; in ahci_port_alloc()
421 ccb->ccb_cmd_hdr = &hdr[i]; in ahci_port_alloc()
422 ccb->ccb_cmd_table = &table[i]; in ahci_port_alloc()
424 ccb->ccb_slot * sizeof(struct ahci_cmd_table); in ahci_port_alloc()
425 ccb->ccb_cmd_hdr->ctba_hi = htole32((u_int32_t)(dva >> 32)); in ahci_port_alloc()
426 ccb->ccb_cmd_hdr->ctba_lo = htole32((u_int32_t)dva); in ahci_port_alloc()
428 ccb->ccb_xa.fis = in ahci_port_alloc()
429 (struct ata_fis_h2d *)ccb->ccb_cmd_table->cfis; in ahci_port_alloc()
430 ccb->ccb_xa.packetcmd = ccb->ccb_cmd_table->acmd; in ahci_port_alloc()
431 ccb->ccb_xa.tag = i; in ahci_port_alloc()
433 ccb->ccb_xa.state = ATA_S_COMPLETE; in ahci_port_alloc()
442 ap->ap_err_ccb = ccb; in ahci_port_alloc()
444 ahci_put_ccb(ccb); in ahci_port_alloc()
900 struct ahci_ccb *ccb;
916 while ((ccb = ahci_get_ccb(ap)) != NULL) {
917 if (ccb->ccb_dmamap) {
919 ccb->ccb_dmamap);
920 ccb->ccb_dmamap = NULL;
923 if ((ccb = ap->ap_err_ccb) != NULL) {
924 if (ccb->ccb_dmamap) {
926 ccb->ccb_dmamap);
927 ccb->ccb_dmamap = NULL;
1175 struct ahci_ccb *ccb = NULL;
1247 ccb = ahci_get_err_ccb(ap);
1248 ccb->ccb_xa.complete = ahci_dummy_done;
1249 ccb->ccb_xa.flags = ATA_F_POLL | ATA_F_EXCLUSIVE;
1250 KKASSERT(ccb->ccb_slot == 1);
1251 ccb->ccb_xa.at = NULL;
1252 cmd_slot = ccb->ccb_cmd_hdr;
1254 fis = ccb->ccb_cmd_table->cfis;
1255 bzero(fis, sizeof(ccb->ccb_cmd_table->cfis));
1264 ccb->ccb_xa.state = ATA_S_PENDING;
1266 if (ahci_poll(ccb, 1000, ahci_quick_timeout) != ATA_S_COMPLETE) {
1287 ccb->ccb_xa.flags = ATA_F_POLL | ATA_F_AUTOSENSE | ATA_F_EXCLUSIVE;
1289 bzero(fis, sizeof(ccb->ccb_cmd_table->cfis));
1296 ccb->ccb_xa.state = ATA_S_PENDING;
1297 if (ahci_poll(ccb, 1000, ahci_quick_timeout) != ATA_S_COMPLETE) {
1333 if (ccb != NULL) {
1334 ahci_put_err_ccb(ccb);
1739 struct ahci_ccb *ccb;
1820 ccb = &ap->ap_ccbs[slot];
1821 if (ccb->ccb_xa.flags & ATA_F_TIMEOUT_RUNNING) {
1822 serial = ccb->ccb_xa.serial;
1823 callout_cancel(&ccb->ccb_timeout);
1824 if (serial != ccb->ccb_xa.serial) {
1826 PORTNAME(ap), ccb);
1829 ccb->ccb_xa.flags &= ~ATA_F_TIMEOUT_RUNNING;
1832 ccb->ccb_xa.flags &= ~(ATA_F_TIMEOUT_DESIRED |
1834 ccb->ccb_xa.state = ATA_S_TIMEOUT;
1835 ccb->ccb_done(ccb);
1836 ccb->ccb_xa.complete(&ccb->ccb_xa);
1841 ccb = &ap->ap_ccbs[slot];
1842 if (ccb->ccb_xa.flags & ATA_F_TIMEOUT_RUNNING) {
1843 serial = ccb->ccb_xa.serial;
1844 callout_cancel(&ccb->ccb_timeout);
1845 if (serial != ccb->ccb_xa.serial) {
1847 PORTNAME(ap), ccb);
1850 ccb->ccb_xa.flags &= ~ATA_F_TIMEOUT_RUNNING;
1853 ccb->ccb_xa.flags &= ~(ATA_F_TIMEOUT_DESIRED |
1855 ccb->ccb_xa.state = ATA_S_TIMEOUT;
1856 ccb->ccb_done(ccb);
1857 ccb->ccb_xa.complete(&ccb->ccb_xa);
1861 while ((ccb = TAILQ_FIRST(&ap->ap_ccb_pending)) != NULL) {
1862 TAILQ_REMOVE(&ap->ap_ccb_pending, ccb, ccb_entry);
1863 ccb->ccb_xa.state = ATA_S_TIMEOUT;
1864 ccb->ccb_xa.flags &= ~ATA_F_TIMEOUT_DESIRED;
1865 ccb->ccb_done(ccb);
1866 ccb->ccb_xa.complete(&ccb->ccb_xa);
1946 ahci_load_prdt(struct ahci_ccb *ccb)
1948 struct ahci_port *ap = ccb->ccb_port;
1950 struct ata_xfer *xa = &ccb->ccb_xa;
1951 struct ahci_prdt *prdt = ccb->ccb_cmd_table->prdt;
1952 bus_dmamap_t dmap = ccb->ccb_dmamap;
1953 struct ahci_cmd_hdr *cmd_slot = ccb->ccb_cmd_hdr;
1957 ccb->ccb_cmd_hdr->prdtl = 0;
1976 cmd_slot->prdtl = htole16(prdt - ccb->ccb_cmd_table->prdt + 1);
2014 ahci_unload_prdt(struct ahci_ccb *ccb)
2016 struct ahci_port *ap = ccb->ccb_port;
2018 struct ata_xfer *xa = &ccb->ccb_xa;
2019 bus_dmamap_t dmap = ccb->ccb_dmamap;
2035 if (ccb->ccb_xa.flags & ATA_F_NCQ) {
2038 if (ccb->ccb_cmd_hdr->prdbc == 0 &&
2039 ccb->ccb_xa.state == ATA_S_COMPLETE) {
2042 ATANAME(ap, xa->at), ccb->ccb_slot);
2045 le32toh(ccb->ccb_cmd_hdr->prdbc);
2068 ahci_poll(struct ahci_ccb *ccb, int timeout,
2071 struct ahci_port *ap = ccb->ccb_port;
2073 if (ccb->ccb_port->ap_state == AP_S_FATAL_ERROR) {
2074 ccb->ccb_xa.state = ATA_S_ERROR;
2075 return(ccb->ccb_xa.state);
2080 ATANAME(ccb->ccb_port, ccb->ccb_xa.at),
2081 ccb->ccb_xa.fis->command, ccb->ccb_slot);
2083 ahci_start(ccb);
2087 switch(ccb->ccb_xa.state) {
2097 return (ccb->ccb_xa.state);
2101 if ((ccb->ccb_xa.flags & ATA_F_SILENT) == 0) {
2104 ATANAME(ap, ccb->ccb_xa.at), ccb->ccb_slot,
2110 timeout_fn(ccb);
2114 return(ccb->ccb_xa.state);
2125 struct ahci_ccb *ccb;
2133 ccb = &ap->ap_ccbs[tag];
2134 if (ccb->ccb_xa.flags & ATA_F_TIMEOUT_EXPIRED) {
2135 ahci_ata_cmd_timeout(ccb);
2143 ahci_start_timeout(struct ahci_ccb *ccb)
2145 if (ccb->ccb_xa.flags & ATA_F_TIMEOUT_DESIRED) {
2146 ccb->ccb_xa.flags |= ATA_F_TIMEOUT_RUNNING;
2147 callout_reset(&ccb->ccb_timeout,
2148 (ccb->ccb_xa.timeout * hz + 999) / 1000,
2149 ahci_ata_cmd_timeout_unserialized, ccb);
2154 ahci_start(struct ahci_ccb *ccb)
2156 struct ahci_port *ap = ccb->ccb_port;
2159 KKASSERT(ccb->ccb_xa.state == ATA_S_PENDING);
2162 ccb->ccb_cmd_hdr->prdbc = 0;
2181 ahci_issue_pending_commands(ap, ccb);
2222 ahci_issue_pending_commands(struct ahci_port *ap, struct ahci_ccb *ccb)
2235 if (ccb) {
2236 TAILQ_INSERT_TAIL(&ap->ap_ccb_pending, ccb, ccb_entry);
2247 if (ccb != ap->ap_err_ccb) {
2248 if ((ccb = TAILQ_FIRST(&ap->ap_ccb_pending)) == NULL)
2251 kprintf("DELAY CCB slot %d\n", ccb->ccb_slot);
2285 if (ccb->ccb_xa.flags &
2291 if (ccb->ccb_xa.flags & ATA_F_NCQ) {
2304 TAILQ_REMOVE(&ap->ap_ccb_pending, ccb, ccb_entry);
2305 KKASSERT((mask & (1 << ccb->ccb_slot)) == 0);
2306 mask |= 1 << ccb->ccb_slot;
2307 KKASSERT(ccb->ccb_xa.state == ATA_S_PENDING);
2308 KKASSERT(ccb == &ap->ap_ccbs[ccb->ccb_slot]);
2309 ccb->ccb_xa.state = ATA_S_ONCHIP;
2310 ahci_start_timeout(ccb);
2311 ap->ap_run_flags = ccb->ccb_xa.flags;
2313 ccb_at = ccb->ccb_xa.at;
2329 ccb = TAILQ_FIRST(&ap->ap_ccb_pending);
2330 } while (ccb && (ccb->ccb_xa.flags & ATA_F_NCQ) &&
2366 while (ap->ap_active_cnt < limit && ccb &&
2367 (ccb->ccb_xa.flags & ATA_F_NCQ) == 0) {
2368 ccb_at = ccb->ccb_xa.at;
2369 TAILQ_REMOVE(&ap->ap_ccb_pending, ccb, ccb_entry);
2371 (1 << ccb->ccb_slot)) == 0);
2372 ap->ap_active |= 1 << ccb->ccb_slot;
2374 ap->ap_run_flags = ccb->ccb_xa.flags;
2375 ccb->ccb_xa.state = ATA_S_ONCHIP;
2376 ahci_start_timeout(ccb);
2388 ahci_pwrite(ap, AHCI_PREG_CI, 1 << ccb->ccb_slot);
2393 ccb = TAILQ_FIRST(&ap->ap_ccb_pending);
2394 if (ccb && (ccb->ccb_xa.flags &
2503 struct ahci_ccb *ccb = NULL;
2670 ccb = &ap->ap_ccbs[err_slot];
2678 if (ccb->ccb_xa.state == ATA_S_ONCHIP) {
2684 ccb_at = ccb->ccb_xa.at;
2691 memcpy(&ccb->ccb_xa.rfis,
2694 rfis = &ccb->ccb_xa.rfis;
2711 ccb->ccb_xa.atascsi_private,
2712 ccb->ccb_slot,
2722 ATANAME(ap, ccb->ccb_xa.at),
2723 err_slot, ccb->ccb_xa.state);
2746 ccb = &ap->ap_ccbs[err_slot];
2748 KKASSERT(ccb->ccb_xa.state == ATA_S_ONCHIP);
2749 ccb->ccb_xa.state = ATA_S_ERROR;
2788 ccb = &ap->ap_ccbs[err_slot];
2791 err_slot, ccb->ccb_xa.fis->command);
3029 ccb = &ap->ap_ccbs[slot];
3030 ccb->ccb_xa.state = ATA_S_TIMEOUT;
3096 ccb = &ap->ap_ccbs[slot];
3100 PORTNAME(ap), slot, ccb->ccb_xa.state == ATA_S_ERROR ?
3115 *active &= ~(1 << ccb->ccb_slot);
3127 if (ap->ap_expired & (1 << ccb->ccb_slot)) {
3128 ap->ap_expired &= ~(1 << ccb->ccb_slot);
3129 ccb->ccb_xa.state = ATA_S_TIMEOUT;
3130 ccb->ccb_done(ccb);
3131 ccb->ccb_xa.complete(&ccb->ccb_xa);
3133 if (ccb->ccb_xa.state == ATA_S_ONCHIP) {
3134 ccb->ccb_xa.state = ATA_S_COMPLETE;
3135 if (ccb->ccb_xa.flags & ATA_F_AUTOSENSE) {
3138 ccb_at = ccb->ccb_xa.at;
3144 memcpy(&ccb->ccb_xa.rfis,
3147 if (ccb->ccb_xa.state == ATA_S_TIMEOUT)
3148 ccb->ccb_xa.state = ATA_S_ERROR;
3151 ccb->ccb_done(ccb);
3240 struct ahci_ccb *ccb;
3243 ccb = TAILQ_FIRST(&ap->ap_ccb_free);
3244 if (ccb != NULL) {
3245 KKASSERT((ap->ap_sactive & (1 << ccb->ccb_slot)) == 0);
3246 KKASSERT(ccb->ccb_xa.state == ATA_S_PUT);
3247 TAILQ_REMOVE(&ap->ap_ccb_free, ccb, ccb_entry);
3248 ccb->ccb_xa.state = ATA_S_SETUP;
3249 ccb->ccb_xa.flags = 0;
3250 ccb->ccb_xa.at = NULL;
3254 return (ccb);
3258 ahci_put_ccb(struct ahci_ccb *ccb)
3260 struct ahci_port *ap = ccb->ccb_port;
3262 KKASSERT(ccb->ccb_xa.state != ATA_S_PUT);
3263 KKASSERT((ap->ap_sactive & (1 << ccb->ccb_slot)) == 0);
3265 ccb->ccb_xa.state = ATA_S_PUT;
3266 ++ccb->ccb_xa.serial;
3267 TAILQ_INSERT_TAIL(&ap->ap_ccb_free, ccb, ccb_entry);
3320 ahci_put_err_ccb(struct ahci_ccb *ccb)
3322 struct ahci_port *ap = ccb->ccb_port;
3335 ccb->ccb_slot, sact);
3342 ccb->ccb_slot, ci,
3346 KKASSERT(ccb == ap->ap_err_ccb);
3365 struct ahci_ccb *ccb;
3382 ccb = ahci_get_err_ccb(ap);
3383 ccb->ccb_xa.flags = ATA_F_READ | ATA_F_POLL;
3384 ccb->ccb_xa.data = ap->ap_err_scratch;
3385 ccb->ccb_xa.datalen = 512;
3386 ccb->ccb_xa.complete = ahci_dummy_done;
3387 ccb->ccb_xa.at = ap->ap_ata[target];
3389 fis = (struct ata_fis_h2d *)ccb->ccb_cmd_table->cfis;
3401 cmd_slot = ccb->ccb_cmd_hdr;
3404 if (ahci_load_prdt(ccb) != 0) {
3409 ccb->ccb_xa.state = ATA_S_PENDING;
3410 if (ahci_poll(ccb, 1000, ahci_quick_timeout) != ATA_S_COMPLETE) {
3412 ahci_unload_prdt(ccb);
3415 ahci_unload_prdt(ccb);
3449 ahci_put_err_ccb(ccb);
3613 struct ahci_ccb *ccb;
3615 ccb = ahci_get_ccb(ap);
3616 if (ccb == NULL) {
3623 PORTNAME(ap), ccb->ccb_slot);
3625 bzero(ccb->ccb_xa.fis, sizeof(*ccb->ccb_xa.fis));
3626 ccb->ccb_xa.at = at;
3627 ccb->ccb_xa.fis->type = ATA_FIS_TYPE_H2D;
3629 return (&ccb->ccb_xa);
3635 struct ahci_ccb *ccb = (struct ahci_ccb *)xa;
3637 DPRINTF(AHCI_D_XFER, "ahci_ata_put_xfer slot %d\n", ccb->ccb_slot);
3639 ahci_put_ccb(ccb);
3645 struct ahci_ccb *ccb = (struct ahci_ccb *)xa;
3650 if (ccb->ccb_port->ap_state == AP_S_FATAL_ERROR)
3652 ccb->ccb_done = ahci_ata_cmd_done;
3654 cmd_slot = ccb->ccb_cmd_hdr;
3656 if (ccb->ccb_xa.at) {
3657 cmd_slot->flags |= htole16(ccb->ccb_xa.at->at_target <<
3667 if (ahci_load_prdt(ccb) != 0)
3673 return (ahci_poll(ccb, xa->timeout, ahci_ata_cmd_timeout));
3678 ahci_start(ccb);
3691 ahci_ata_cmd_done(struct ahci_ccb *ccb)
3693 struct ata_xfer *xa = &ccb->ccb_xa;
3704 serial = ccb->ccb_xa.serial;
3705 callout_cancel(&ccb->ccb_timeout);
3706 if (serial != ccb->ccb_xa.serial) {
3708 PORTNAME(ccb->ccb_port), ccb);
3714 ccb->ccb_port->ap_expired &= ~(1 << ccb->ccb_slot);
3717 ahci_unload_prdt(ccb);
3733 struct ahci_ccb *ccb = arg;
3734 struct ahci_port *ap = ccb->ccb_port;
3736 KKASSERT(ccb->ccb_xa.flags & ATA_F_TIMEOUT_RUNNING);
3737 ccb->ccb_xa.flags &= ~ATA_F_TIMEOUT_RUNNING;
3738 ccb->ccb_xa.flags |= ATA_F_TIMEOUT_EXPIRED;
3752 ahci_ata_cmd_timeout(struct ahci_ccb *ccb)
3754 struct ata_xfer *xa = &ccb->ccb_xa;
3755 struct ahci_port *ap = ccb->ccb_port;
3761 at = ccb->ccb_xa.at;
3771 ccb->ccb_xa.state, ccb->ccb_slot,
3790 if (ccb->ccb_xa.state == ATA_S_PENDING) {
3791 TAILQ_REMOVE(&ap->ap_ccb_pending, ccb, ccb_entry);
3792 ccb->ccb_xa.state = ATA_S_TIMEOUT;
3793 ccb->ccb_done(ccb);
3798 if (ccb->ccb_xa.state != ATA_S_ONCHIP) {
3800 ATANAME(ap, at), ccb->ccb_xa.state);
3814 ap->ap_expired |= 1 << ccb->ccb_slot;
3823 ATANAME(ap, at), ccb->ccb_slot);
3839 ccb = &ap->ap_ccbs[slot];
3840 ccb->ccb_xa.state = ATA_S_TIMEOUT;
3841 if (ccb->ccb_xa.flags & ATA_F_NCQ) {
3849 ccb->ccb_done(ccb);
3850 ccb->ccb_xa.complete(&ccb->ccb_xa);
3939 ahci_quick_timeout(struct ahci_ccb *ccb)
3941 struct ahci_port *ap = ccb->ccb_port;
3944 switch (ccb->ccb_xa.state) {
3946 TAILQ_REMOVE(&ap->ap_ccb_pending, ccb, ccb_entry);
3947 ccb->ccb_xa.state = ATA_S_TIMEOUT;
3953 KKASSERT(ap->ap_active == (1 << ccb->ccb_slot) &&
3967 ccb->ccb_xa.state = ATA_S_TIMEOUT;
3968 ap->ap_active &= ~(1 << ccb->ccb_slot);
3974 ATANAME(ap, ccb->ccb_xa.at), ccb->ccb_xa.state);
3984 ahci_empty_done(struct ahci_ccb *ccb)