int snd_fw_async_midi_port_init(struct snd_fw_async_midi_port *port,
                struct fw_unit *unit)
 {
-       port->buf = kzalloc(4, GFP_KERNEL);
-       if (port->buf == NULL)
-               return -ENOMEM;
-
        port->parent = fw_parent_device(unit);
        port->idling = true;
        port->next_ktime = 0;
        return 0;
 }
 
-void snd_fw_async_midi_port_destroy(struct snd_fw_async_midi_port *port)
-{
-       snd_fw_async_midi_port_finish(port);
-       cancel_work_sync(&port->work);
-       kfree(port->buf);
-}
-
 static void handle_midi_tx(struct fw_card *card, struct fw_request *request,
                           int tcode, int destination, int source,
                           int generation, unsigned long long offset,
 void snd_tscm_transaction_unregister(struct snd_tscm *tscm)
 {
        __be32 reg;
-       unsigned int i;
 
        if (tscm->async_handler.callback_data == NULL)
                return;
 
        fw_core_remove_address_handler(&tscm->async_handler);
        tscm->async_handler.callback_data = NULL;
-
-       for (i = 0; i < TSCM_MIDI_OUT_PORT_MAX; i++)
-               snd_fw_async_midi_port_destroy(&tscm->out_ports[i]);
 }
 
 
        struct fw_transaction transaction;
 
-       u8 *buf;
+       u8 buf[4];
 
        struct snd_rawmidi_substream *substream;
        int consume_bytes;
 
 int snd_fw_async_midi_port_init(struct snd_fw_async_midi_port *port,
                struct fw_unit *unit);
-void snd_fw_async_midi_port_destroy(struct snd_fw_async_midi_port *port);
 
 static inline void
 snd_fw_async_midi_port_run(struct snd_fw_async_midi_port *port,
 snd_fw_async_midi_port_finish(struct snd_fw_async_midi_port *port)
 {
        port->substream = NULL;
+       cancel_work_sync(&port->work);
        port->error = false;
 }