[alsa-devel] [PATCH 2/2] ALSA: fireworks/firewire-lib: add support for recent firmware quirk

Takashi Iwai tiwai at suse.de
Wed Aug 5 07:55:41 CEST 2015


On Wed, 05 Aug 2015 02:21:05 +0200,
Takashi Sakamoto wrote:
> 
> Fireworks uses TSB43CB43(IceLynx-Micro) as its IEC 61883-1/6 interface.
> This chip includes ARM7 core, and loads and runs program. The firmware
> is stored in on-board memory and loaded every powering-on from it.
> 
> Echo Audio ships several versions of firmwares for each model. These
> firmwares have each quirk and the quirk changes a sequence of packets.
> 
> As long as I investigated, AudioFire2/AudioFire4/AudioFirePre8 have a
> quirk to transfer a first packet with 0x02 in its dbc field. This causes
> ALSA Fireworks driver to detect discontinuity. In this case, firmware
> version 5.7.0, 5.7.3 and 5.8.0 are used.
> 
> Payload  CIP      CIP
> quadlets header1  header2
> 02       00050002 90ffffff <-
> 42       0005000a 90013000
> 42       00050012 90014400
> 42       0005001a 90015800
> 02       0005001a 90ffffff
> 42       00050022 90019000
> 42       0005002a 9001a400
> 42       00050032 9001b800
> 02       00050032 90ffffff
> 42       0005003a 9001d000
> 42       00050042 9001e400
> 42       0005004a 9001f800
> 02       0005004a 90ffffff
> (AudioFire2 with firmware version 5.7.)
> 
> $ dmesg
> snd-fireworks fw1.0: Detect discontinuity of CIP: 00 02
> 
> These models, AudioFire8 (since Jul 2009 ) and Gibson Robot Interface
> Pack series uses the same ARM binary as their firmware. Thus, this
> quirk may be observed among them.
> 
> This commit adds a new member for AMDTP structure. This member represents
> the value of dbc field in a first AMDTP packet. Drivers can set it with
> a preferred value according to model's quirk.
> 
> Tested-by: Johannes Oertei <johannes.oertel at uni-due.de>
> Signed-off-by: Takashi Sakamoto <o-takashi at sakamocchi.jp>

Applied with Cc to stable.  At the next time, if you think it's worth
for stable backports, feel free to add Cc to stable in your patch.


thanks,

Takashi


> ---
>  sound/firewire/amdtp.c                      | 5 +++--
>  sound/firewire/amdtp.h                      | 2 ++
>  sound/firewire/fireworks/fireworks.c        | 8 ++++++++
>  sound/firewire/fireworks/fireworks.h        | 1 +
>  sound/firewire/fireworks/fireworks_stream.c | 9 +++++++++
>  5 files changed, 23 insertions(+), 2 deletions(-)
> 
> diff --git a/sound/firewire/amdtp.c b/sound/firewire/amdtp.c
> index 7bb988f..2a153d2 100644
> --- a/sound/firewire/amdtp.c
> +++ b/sound/firewire/amdtp.c
> @@ -740,8 +740,9 @@ static int handle_in_packet(struct amdtp_stream *s,
>  	    s->data_block_counter != UINT_MAX)
>  		data_block_counter = s->data_block_counter;
>  
> -	if (((s->flags & CIP_SKIP_DBC_ZERO_CHECK) && data_block_counter == 0) ||
> -	    (s->data_block_counter == UINT_MAX)) {
> +	if (((s->flags & CIP_SKIP_DBC_ZERO_CHECK) &&
> +	     data_block_counter == s->tx_first_dbc) ||
> +	    s->data_block_counter == UINT_MAX) {
>  		lost = false;
>  	} else if (!(s->flags & CIP_DBC_IS_END_EVENT)) {
>  		lost = data_block_counter != s->data_block_counter;
> diff --git a/sound/firewire/amdtp.h b/sound/firewire/amdtp.h
> index 26b9093..b2cf9e7 100644
> --- a/sound/firewire/amdtp.h
> +++ b/sound/firewire/amdtp.h
> @@ -157,6 +157,8 @@ struct amdtp_stream {
>  
>  	/* quirk: fixed interval of dbc between previos/current packets. */
>  	unsigned int tx_dbc_interval;
> +	/* quirk: indicate the value of dbc field in a first packet. */
> +	unsigned int tx_first_dbc;
>  
>  	bool callbacked;
>  	wait_queue_head_t callback_wait;
> diff --git a/sound/firewire/fireworks/fireworks.c b/sound/firewire/fireworks/fireworks.c
> index 2682e7e..c94a432 100644
> --- a/sound/firewire/fireworks/fireworks.c
> +++ b/sound/firewire/fireworks/fireworks.c
> @@ -248,8 +248,16 @@ efw_probe(struct fw_unit *unit,
>  	err = get_hardware_info(efw);
>  	if (err < 0)
>  		goto error;
> +	/* AudioFire8 (since 2009) and AudioFirePre8 */
>  	if (entry->model_id == MODEL_ECHO_AUDIOFIRE_9)
>  		efw->is_af9 = true;
> +	/* These models uses the same firmware. */
> +	if (entry->model_id == MODEL_ECHO_AUDIOFIRE_2 ||
> +	    entry->model_id == MODEL_ECHO_AUDIOFIRE_4 ||
> +	    entry->model_id == MODEL_ECHO_AUDIOFIRE_9 ||
> +	    entry->model_id == MODEL_GIBSON_RIP ||
> +	    entry->model_id == MODEL_GIBSON_GOLDTOP)
> +		efw->is_fireworks3 = true;
>  
>  	snd_efw_proc_init(efw);
>  
> diff --git a/sound/firewire/fireworks/fireworks.h b/sound/firewire/fireworks/fireworks.h
> index 4f0201a..084d414 100644
> --- a/sound/firewire/fireworks/fireworks.h
> +++ b/sound/firewire/fireworks/fireworks.h
> @@ -71,6 +71,7 @@ struct snd_efw {
>  
>  	/* for quirks */
>  	bool is_af9;
> +	bool is_fireworks3;
>  	u32 firmware_version;
>  
>  	unsigned int midi_in_ports;
> diff --git a/sound/firewire/fireworks/fireworks_stream.c b/sound/firewire/fireworks/fireworks_stream.c
> index c55db1b..7e353f1 100644
> --- a/sound/firewire/fireworks/fireworks_stream.c
> +++ b/sound/firewire/fireworks/fireworks_stream.c
> @@ -172,6 +172,15 @@ int snd_efw_stream_init_duplex(struct snd_efw *efw)
>  	efw->tx_stream.flags |= CIP_DBC_IS_END_EVENT;
>  	/* Fireworks reset dbc at bus reset. */
>  	efw->tx_stream.flags |= CIP_SKIP_DBC_ZERO_CHECK;
> +	/*
> +	 * But Recent firmwares starts packets with non-zero dbc.
> +	 * Driver version 5.7.6 installs firmware version 5.7.3.
> +	 */
> +	if (efw->is_fireworks3 &&
> +	    (efw->firmware_version == 0x5070000 ||
> +	     efw->firmware_version == 0x5070300 ||
> +	     efw->firmware_version == 0x5080000))
> +		efw->tx_stream.tx_first_dbc = 0x02;
>  	/* AudioFire9 always reports wrong dbs. */
>  	if (efw->is_af9)
>  		efw->tx_stream.flags |= CIP_WRONG_DBS;
> -- 
> 2.1.4
> 


More information about the Alsa-devel mailing list