Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset dda5848 in mainline


Ignore:
Timestamp:
2014-08-26T23:07:47Z (6 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
9034876
Parents:
2f6b916
Message:

Fix buffer overrun errors.

Location:
uspace/drv/audio/hdaudio
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/audio/hdaudio/codec.c

    r2f6b916 rdda5848  
    5656        verb = (codec->address << 28) | (node << 20) | (vid << 8) | payload;
    5757        int rc = hda_cmd(codec->hda, verb, resp);
     58/*
    5859        if (resp != NULL) {
    5960                ddf_msg(LVL_NOTE, "verb 0x%" PRIx32 " -> 0x%" PRIx32, verb,
     
    6263                ddf_msg(LVL_NOTE, "verb 0x%" PRIx32, verb);
    6364        }
     65*/
    6466        return rc;
    6567}
     
    409411
    410412                        } else if (awtype == awt_audio_output) {
    411                                 codec->out_aw = aw;
    412413                                codec->out_aw_list[codec->out_aw_num++] = aw;
     414
     415                                rc = hda_get_supp_rates(codec, aw, &rates);
     416                                if (rc != EOK)
     417                                        goto error;
     418
     419                                rc = hda_get_supp_formats(codec, aw, &formats);
     420                                if (rc != EOK)
     421                                        goto error;
     422
     423                                ddf_msg(LVL_NOTE, "Output widget %d: rates=0x%x formats=0x%x",
     424                                    aw, rates, formats);
    413425                        }
    414426
    415 if (0) {
    416427                        if ((awcaps & BIT_V(uint32_t, awc_out_amp_present)) != 0)
    417428                                hda_set_out_amp_max(codec, aw);
     
    419430                        if ((awcaps & BIT_V(uint32_t, awc_in_amp_present)) != 0)
    420431                                hda_set_in_amp_max(codec, aw);
    421 }
    422432                }
    423433        }
    424434
    425         rc = hda_get_supp_rates(codec, codec->out_aw, &rates);
    426         if (rc != EOK)
    427                 goto error;
    428 
    429         rc = hda_get_supp_formats(codec, codec->out_aw, &formats);
    430         if (rc != EOK)
    431                 goto error;
    432 
    433         ddf_msg(LVL_NOTE, "Output widget %d: rates=0x%x formats=0x%x",
    434             codec->out_aw, rates, formats);
     435        hda_ctl_dump_info(hda->ctl);
    435436
    436437        ddf_msg(LVL_NOTE, "Codec OK");
  • uspace/drv/audio/hdaudio/codec.h

    r2f6b916 rdda5848  
    4343        hda_t *hda;
    4444        uint8_t address;
    45         uint8_t out_aw;
    4645        uint8_t out_aw_list[MAX_OUT_AW];
    4746        int out_aw_num;
  • uspace/drv/audio/hdaudio/hdactl.c

    r2f6b916 rdda5848  
    106106 *
    107107 * We always use the largest available size. In @a sizecap each of bits
    108  * 0, 1, 2 determine whether one of the supported size (0 == 2 enries,
     108 * 0, 1, 2 determine whether one of the supported size (0 == 2 entries,
    109109 * 1 == 16 entries, 2 == 256 entries) is supported. @a *selsz is set to
    110110 * one of 0, 1, 2 on success.
     
    249249        }
    250250        rirbsz = rirbsz & ~BIT_RANGE(uint8_t, rirbsize_size_h, rirbsize_size_l);
    251         rirbsz = rirbsz | selsz;
     251        rirbsz = rirbsz | (selsz << rirbsize_size_l);
    252252
    253253        ddf_msg(LVL_NOTE, "Setting RIRB Size register to 0x%x", rirbsz);
     
    395395                return ENOENT;
    396396
    397         ++hda->ctl->rirb_rp;
     397        hda->ctl->rirb_rp = (hda->ctl->rirb_rp + 1) % hda->ctl->rirb_entries;
    398398        resp = rirb[hda->ctl->rirb_rp];
    399399
     
    415415        while (count > 0) {
    416416                while (count > 0 && hda->ctl->solrb_rp != hda->ctl->solrb_wp) {
    417                         ++hda->ctl->solrb_rp;
     417                        hda->ctl->solrb_rp = (hda->ctl->solrb_rp + 1) % softrb_entries;
    418418                        resp = hda->ctl->solrb[hda->ctl->solrb_rp];
    419419
     
    629629}
    630630
     631void hda_ctl_dump_info(hda_ctl_t *ctl)
     632{
     633        ddf_msg(LVL_NOTE, "corbwp=%d, corbrp=%d",
     634            hda_reg16_read(&ctl->hda->regs->corbwp),
     635            hda_reg16_read(&ctl->hda->regs->corbrp));
     636        ddf_msg(LVL_NOTE, "corbctl=0x%x, corbsts=0x%x",
     637            hda_reg8_read(&ctl->hda->regs->corbctl),
     638            hda_reg8_read(&ctl->hda->regs->corbsts));
     639        ddf_msg(LVL_NOTE, "rirbwp=0x%x, soft-rirbrp=0x%x",
     640            hda_reg16_read(&ctl->hda->regs->rirbwp),
     641            ctl->rirb_rp);
     642        ddf_msg(LVL_NOTE, "solrb_wp=0x%x, solrb_rp=0x%x",
     643            ctl->solrb_wp, ctl->solrb_wp);
     644}
     645
    631646/** @}
    632647 */
  • uspace/drv/audio/hdaudio/hdactl.h

    r2f6b916 rdda5848  
    7979extern void hda_ctl_interrupt(hda_ctl_t *);
    8080extern int hda_cmd(hda_t *, uint32_t, uint32_t *);
     81extern void hda_ctl_dump_info(hda_ctl_t *);
    8182
    8283#endif
Note: See TracChangeset for help on using the changeset viewer.