lkml.org 
[lkml]   [2008]   [Aug]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH 2/2] Add Dell laptop driver
Matthew Garrett <mjg59 <at> srcf.ucam.org> writes:



> diff --git a/drivers/misc/dell-laptop.c b/drivers/misc/dell-laptop.c
> new file mode 100644
> index 0000000..ab09a69
> --- /dev/null
> +++ b/drivers/misc/dell-laptop.c

[Snip]

> + da_command_address = table->cmdIOAddress;
> + da_command_code = table->cmdIOCode;
> +
> + da_tokens = krealloc(da_tokens, (da_num_tokens + tokens) *
> + sizeof(struct calling_interface_token),
> + GFP_KERNEL);

Isn't a NULL check required here?

> +
> + memcpy(da_tokens+da_num_tokens, table->tokens,
> + sizeof(struct calling_interface_token) * tokens);
> +

> +static struct calling_interface_buffer *dell_send_request(
> + struct calling_interface_buffer *buffer, int class, int select)
> +{
> + struct smi_cmd *command = kzalloc(sizeof(struct smi_cmd), GFP_KERNEL);

NULL check - Here too.

> + command->magic = SMI_CMD_MAGIC;
> + command->command_address = da_command_address;
> + command->command_code = da_command_code;
> + command->ebx = virt_to_phys(buffer);
> + command->ecx = 0x42534931;
> +

> +
> +static int dell_rfkill_set(int radio, enum rfkill_state state)
> +{
> + struct calling_interface_buffer *buffer =
> + kzalloc(sizeof(struct calling_interface_buffer), GFP_KERNEL);

Ditto.

> + int disable = (state == RFKILL_STATE_UNBLOCKED) ? 0 : 1;
> + buffer->input[0] = (1 | (radio<<8) | (disable << 16));
> + dell_send_request(buffer, 17, 11);
> + kfree(buffer);
> + return 0;
> +}

> +static int dell_rfkill_get(int bit, enum rfkill_state *state)
> +{
> + struct calling_interface_buffer *buffer =
> + kzalloc(sizeof(struct calling_interface_buffer), GFP_KERNEL);

This makes me confident there is code in the kernel that always
succeeds allocations by mjg59.
Just got to find where it's hidden :)


> +static int dell_wifi_get(void *data, enum rfkill_state *state)
> +{
> + return dell_rfkill_get(17, state);
> +}
> +
> +static int dell_bluetooth_get(void *data, enum rfkill_state *state)
> +{
> + return dell_rfkill_get(18, state);
> +}
> +
> +static int dell_wwan_get(void *data, enum rfkill_state *state)
> +{
> + return dell_rfkill_get(19, state);
> +}
> +
> +static void dell_setup_rfkill(void)
> +{
> + struct calling_interface_buffer *buffer =
> + kzalloc(sizeof(struct calling_interface_buffer), GFP_KERNEL);

Once more.

> +
> +static int dell_send_intensity(struct backlight_device *bd)
> +{
> + int intensity = bd->props.brightness;
> + struct calling_interface_buffer *buffer =
> + kzalloc(sizeof(struct calling_interface_buffer), GFP_KERNEL);

Stopped counting!

> +
> + buffer->input[0] = find_token_location(0x7d);
> + buffer->input[1] = intensity;
> +
> + if (buffer->input[0] == -1) {
> + kfree(buffer);
> + return -ENODEV;
> + }


> +
> +static int dell_get_intensity(struct backlight_device *bd)
> +{
> + struct calling_interface_buffer *buffer =
> + kzalloc(sizeof(struct calling_interface_buffer), GFP_KERNEL);

count_prev++;

> + if (!dmi_check_system(dell_device_table))
> + return -ENODEV;
> +
> + dmi_walk(find_tokens);
> +
> + if (!da_tokens)
> + return -ENODEV;
> +
> + buffer = kzalloc(sizeof(struct calling_interface_buffer), GFP_KERNEL);

One last.

> + buffer->input[0] = find_token_location(0x7d);
> +
> + if (buffer->input[0] != -1) {
> + dell_send_request(buffer, 2, 1);
> + max_intensity = buffer->output[3];
> + }
> +


Parag


\
 
 \ /
  Last update: 2008-08-17 01:19    [W:0.259 / U:0.280 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site